2017-01-01 7 views
1

addr2line переводит адреса в имена файлов и номера строк. Я все еще новичок в отладке и задаю некоторые вопросы о addr2line.Как addr2line может найти исходный файл и строку кода?

  1. Если я отладка (двоичный) файл определенного .so, как инструмент может найти его исходный файл кода (из которого можно получить его!), Что если источник не существует?

  2. Какова связь между адресом в двоичном выражении и строкой номер в его источнике, поэтому addr2line может выполнять такое сопоставление?

ответ

3

В общем, addr2line лучше всего работает на ELF исполняемых файлов или разделяемых библиотек с отладочной информацией. Эта отладочная информация испускается компилятором, когда вы pass -g (или -g2 и т. Д.) До GCC. Это особенно обеспечивает сопоставление между расположением исходного кода (имя исходного файла, номера строки, номера столбца) и функций, имен переменных, call stack организации кадра и т. Д. И т. Д. ... Отладочная информация сегодня в формате DWARF (и также обрабатывается gdb debugger, libbacktrace library и т. д. и т. д.). Обратите внимание, что отладочная информация содержит пути к исходным файлам (а не исходный файл).

На практике, вы можете (и часто должны) пройти -g (или -g2) отладки опцию GCC даже с optimization флагами, как -O2. В этом случае отладочная информация немного менее точная, но практически применима. В некоторых случаях кадры стека могут исчезать (встроенные вызовы функций, оптимизация хвостовых вызовов, ....).

Вы можете использовать утилиту strip(1) для удаления информации об отладке (и других таблиц символов и т. Д.) С некоторых ELF executable.