Как addr2line может найти исходный файл и строку кода?

addr2line переводит адреса в имена файлов и номера строк. Я все еще новичок в отладке, и у меня есть несколько вопросов о addr2line.

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

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

1 ответ

Решение

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

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

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

Другие вопросы по тегам