Як я можу дізнатися, чи бібліотека була складена з -g?


103

У мене є кілька скомпільованих бібліотек на x86 Linux, і я хочу швидко визначити, чи були вони зібрані з налагоджувальними символами.

Відповіді:


85

Якщо ви працюєте в Linux, використовуйте objdump --debugging. Для кожного об’єктного файлу в бібліотеці повинен бути запис. Для об’єктних файлів без налагоджувальних символів ви побачите щось на зразок:

objdump --debugging libvoidincr.a
In archive libvoidincr.a:

voidincr.o:     file format elf64-x86-64

Якщо є налагоджувальні символи, вихід буде набагато більш багатослівним.


5
Є також obdjump -W libі readelf -w lib. Останнє можна налаштувати - див. Сторінку readelf (1).
przemoc

3
Для будь-якого бінарного (включаючи ті, що компілюються з -g) objdump дає мені відповідь "немає визнаної інформації про налагодження", якщо я не компілюю її з -gstabs. Здається, це виявлена ​​помилка.
Ден Хук

Ден, на якій платформі ти це спробував?
swegi

Зайнята російська мова: від man objdump (1) прапор --debugging "намагається проаналізувати інформацію про формат STABS та IEEE, що зберігається у файлі, та роздрукує її за допомогою синтаксису типу C. Якщо жоден із цих форматів не знайдений, ця опція відпадає на опцію -W для друку будь-якої інформації DWARF у файлі. "
Метт МакКлеллан

5
objdump -gне дає мені нічого за простий тест.o, складений і з, і без g, що робить його ефективно марним. Ubuntu 12.04, gcc 4.6.3, GNU objdump 2.22. nm -aздається, корисніше.
jw013

89

Запропонована команда

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.


1
працює чудово. Я спробував цю команду на своєму виконаному файлі за допомогою першого CMAKE_BUILD_TYPE RELEASE, і команда повернулася порожньою. Тоді я спробував з DEBUG CMAKE_BUILD_TYPE, і тоді було досить багато результатів.
infoclogged

32

Що допомогло:

gdb mylib.so

Він друкує, коли символи налагодження не знайдені:

Reading symbols from mylib.so...(no debugging symbols found)...done.

Або коли його знайдуть:

Reading symbols from mylib.so...done.

Жодна з попередніх відповідей не дала для мене значущих результатів: величини без символів налагодження давали багато результатів тощо.


Дякую! Це працювало для мене, використовуючи компілятор
clang

супер чудово для швидкої перевірки! також працює на * .o об’єктних файлах.
Стефан Ролланд

28

nm -a <lib> буде надрукувати всі символи з бібліотеки, включаючи налагоджувальні.

Таким чином, ви можете порівнювати результати nm <lib>та nm -a <lib>- якщо вони різняться, у вашій lib є деякі символи налагодження.


3
@ Безробітний Російський Ви можете, будь ласка, детальніше розглянути це? Чому ви вважаєте, що це неправильний інструмент? Це робить свою роботу, і це робить і в Linux.
qrdl

Навіть для вбудованого Linux на базі ядра 2.6.35, xxx-objdump, xxx-nm працює чудово.
agfe2

nm -aмає псевдонім, nm --debug-symsякий пояснює себе :-).
певік

3
Просто наберіть, diff <(nm <lib>) <(nm -a <lib>)щоб отримати просту
різницю

17

На OSX можна використовувати dsymutil -sі dwarfdump.

Використовуючи, dsymutil -s <lib_file> | moreви побачите шляхи до вихідних файлів у файлах, що мають налагоджувальні символи, але лише імена функцій інакше.


11
Чи можете ви надати детальну інформацію про те, що шукати у результатах, наприклад dsymutil -s,? Чи означає наявність висновку, що він був побудований з налагодженими символами, або він повинен бути зафіксований?
Мітч

12

Ви можете використовувати objdump для цього.

РЕДАКТУВАННЯ: З чоловічої сторінки:

-W
--dwarf
Displays  the  contents of the DWARF debug sections in the file, if
any are present.

6

Відповіді, які пропонують використовувати 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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.