У меня есть несколько скомпилированных библиотек на x86 Linux, и я хочу быстро определить, были ли они скомпилированы с отладочными символами.
c
debugging
gdb
debug-symbols
Дэн Хук
источник
источник
obdjump -W lib
иreadelf -w lib
. Последний вариант более настраиваемый - см. Справочную страницу readelf (1).objdump -g
ничего не дает для простого test.o, скомпилированного как с, так и безg
, что делает его практически бесполезным. Ubuntu 12.04, gcc 4.6.3, GNU objdump 2.22.nm -a
кажется более полезным.Предлагаемая команда
дает мне всегда один и тот же результат, по крайней мере, на Ubuntu / Linaro 4.5.2:
независимо от того, была ли создана архивная / общая библиотека с
-g
опцией или без нееЧто действительно помогло мне определить,
-g
использовался ли инструмент, так это инструмент readelf :или
Это распечатает набор строк, состоящий из исходного имени файла, номера строки и адреса, если такая отладочная информация включена в библиотеку , иначе он ничего не напечатает .
Вы можете передать любое значение, которое сочтете необходимым для
--debug-dump
option вместоdecodedline
.источник
Что помогло:
Он печатает, когда символы отладки не найдены:
Или при обнаружении:
Ни один из предыдущих ответов не дал для меня значимых результатов: библиотеки без символов отладки давали много результатов и т. Д.
источник
nm -a <lib>
распечатает все символы из библиотеки, в том числе отладочные.Таким образом, вы можете сравнить выходные данные
nm <lib>
иnm -a <lib>
- если они отличаются, ваша библиотека содержит некоторые символы отладки.источник
nm -a
имеет псевдоним,nm --debug-syms
который не требует пояснений :-).diff <(nm <lib>) <(nm -a <lib>)
чтобы получить простуюВ OSX вы можете использовать
dsymutil -s
иdwarfdump
.При использовании
dsymutil -s <lib_file> | more
вы увидите пути к исходным файлам в файлах, которые имеют символы отладки, но в противном случае только имена функций.источник
dsymutil -s
? Означает ли существование вывода, что он был построен с использованием символов отладки, или его нужно использовать с помощью grep?Вы можете использовать objdump для этого .
РЕДАКТИРОВАТЬ: со страницы руководства:
источник
Ответы, предлагающие использовать
objdump --debugging
илиreadelf --debug-dump=...
не работают в случае, если отладочная информация хранится в файле, отдельном от двоичного файла, т.е. двоичный файл содержит раздел отладочной ссылки . Возможно, это можно было бы назвать ошибкой вreadelf
.Следующий код должен обрабатывать это правильно:
См. Раздел « Отдельные файлы отладки» в руководстве GDB для получения дополнительной информации.
источник