Відповіді:
Якщо ви працюєте в Linux, використовуйте objdump --debugging
. Для кожного об’єктного файлу в бібліотеці повинен бути запис. Для об’єктних файлів без налагоджувальних символів ви побачите щось на зразок:
objdump --debugging libvoidincr.a
In archive libvoidincr.a:
voidincr.o: file format elf64-x86-64
Якщо є налагоджувальні символи, вихід буде набагато більш багатослівним.
objdump -g
не дає мені нічого за простий тест.o, складений і з, і без g
, що робить його ефективно марним. Ubuntu 12.04, gcc 4.6.3, GNU objdump 2.22. nm -a
здається, корисніше.
Запропонована команда
objdump --debugging libinspected.a
objdump --debugging libinspected.so
завжди дає однаковий результат принаймні на Ubuntu / Linaro 4.5.2:
libinspected.a: file format elf64-x86-64
libinspected.so: file format elf64-x86-64
незалежно від того, архів / спільна бібліотека була побудована з або без -g
варіантом
Що мені дійсно допомогло визначити, чи -g
використовувався це інструмент readelf :
readelf --debug-dump=decodedline libinspected.so
або
readelf --debug-dump=line libinspected.so
Це дозволить роздрукувати набір рядків, що складаються з імені файлу джерела, номера рядка та адреси, якщо така інформація про налагодження включена до бібліотеки , інакше вона не надрукує нічого .
Ви можете передавати будь-яке значення, яке вам не знадобиться --debug-dump
замість опції decodedline
.
Що допомогло:
gdb mylib.so
Він друкує, коли символи налагодження не знайдені:
Reading symbols from mylib.so...(no debugging symbols found)...done.
Або коли його знайдуть:
Reading symbols from mylib.so...done.
Жодна з попередніх відповідей не дала для мене значущих результатів: величини без символів налагодження давали багато результатів тощо.
nm -a <lib>
буде надрукувати всі символи з бібліотеки, включаючи налагоджувальні.
Таким чином, ви можете порівнювати результати nm <lib>
та nm -a <lib>
- якщо вони різняться, у вашій lib є деякі символи налагодження.
nm -a
має псевдонім, nm --debug-syms
який пояснює себе :-).
diff <(nm <lib>) <(nm -a <lib>)
щоб отримати просту
На OSX можна використовувати dsymutil -s
і dwarfdump
.
Використовуючи, dsymutil -s <lib_file> | more
ви побачите шляхи до вихідних файлів у файлах, що мають налагоджувальні символи, але лише імена функцій інакше.
dsymutil -s
,? Чи означає наявність висновку, що він був побудований з налагодженими символами, або він повинен бути зафіксований?
Відповіді, які пропонують використовувати objdump --debugging
або readelf --debug-dump=...
не працювати у тому випадку, коли інформація про налагодження зберігається у файлі, окремому від двійкового, тобто двійковий містить розділ посилання для налагодження . Можливо, можна було б назвати цю помилку readelf
.
Наступний код повинен правильно впоратися з цим:
# Test whether debug information is available for a given binary
has_debug_info() {
readelf -S "$1" | grep -q " \(.debug_info\)\|\(.gnu_debuglink\) "
}
Для отримання додаткової інформації див. Окремі файли налагодження в посібнику GDB.
obdjump -W lib
іreadelf -w lib
. Останнє можна налаштувати - див. Сторінку readelf (1).