Wie kann ich feststellen, ob eine Bibliothek mit -g kompiliert wurde?

103

Ich habe einige kompilierte Bibliotheken unter x86 Linux und möchte schnell feststellen, ob sie mit Debugging-Symbolen kompiliert wurden.

Dan Hook
quelle

Antworten:

85

Wenn Sie unter Linux arbeiten, verwenden Sie objdump --debugging. Für jede Objektdatei in der Bibliothek sollte ein Eintrag vorhanden sein. Bei Objektdateien ohne Debugging-Symbole wird Folgendes angezeigt:

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

voidincr.o:     file format elf64-x86-64

Wenn es Debugging-Symbole gibt, ist die Ausgabe viel ausführlicher.

Matt McClellan
quelle
5
Es gibt auch obdjump -W libund readelf -w lib. Letzteres ist konfigurierbarer - siehe Readelf (1) Manpage.
Przemoc
3
Für jede Binärdatei (einschließlich der mit -g kompilierten) gibt objdump die Antwort "Keine erkannten Debugging-Informationen", es sei denn, ich kompiliere sie mit -gstabs. Dies scheint ein erkannter Fehler zu sein.
Dan Hook
Dan, auf welcher Plattform hast du das versucht?
Swegi
Angestelltes Russisch: Von man objdump (1) versucht das Flag --debugging, die in der Datei gespeicherten Informationen zum STABS- und IEEE-Debugging-Format zu analysieren und mit einer C-ähnlichen Syntax auszudrucken. Wenn keines dieser Formate gefunden wird, greift diese Option zurück auf die Option -W, um DWARF-Informationen in der Datei zu drucken. "
Matt McClellan
5
objdump -ggibt mir nichts für einen einfachen test.o mit und ohne kompiliert g, was es praktisch nutzlos macht. Ubuntu 12.04, gcc 4.6.3, GNU objdump 2.22. nm -ascheint nützlicher zu sein.
jw013
89

Der vorgeschlagene Befehl

objdump --debugging libinspected.a
objdump --debugging libinspected.so

gibt mir immer das gleiche Ergebnis zumindest unter Ubuntu / Linaro 4.5.2:

libinspected.a:     file format elf64-x86-64
libinspected.so:     file format elf64-x86-64

egal ob das Archiv / die gemeinsam genutzte Bibliothek mit oder ohne -gOption erstellt wurde

Was mir wirklich geholfen hat festzustellen, ob -ges verwendet wurde, ist das Readelf- Tool:

readelf --debug-dump=decodedline libinspected.so

oder

readelf --debug-dump=line libinspected.so

Dies druckt eine Reihe von Zeilen aus Quellendateiname, Zeilennummer und Adresse aus, wenn solche Debug-Informationen in der Bibliothek enthalten sind , andernfalls wird nichts gedruckt .

Sie können den Wert übergeben, den Sie für die --debug-dumpOption anstelle von erforderlich finden decodedline.

Alex InTechno
quelle
1
funktioniert perfekt. Ich habe diesen Befehl in meiner ausführbaren Datei mit der ersten CMAKE_BUILD_TYPE RELEASE ausprobiert und der Befehl wurde leer zurückgegeben. Dann habe ich es mit CMAKE_BUILD_TYPE DEBUG versucht und dann gab es ziemlich viel Ausgabe.
Infoclogged
32

Was geholfen hat ist:

gdb mylib.so

Es wird gedruckt, wenn Debug-Symbole nicht gefunden werden:

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

Oder wenn gefunden:

Reading symbols from mylib.so...done.

Keine der früheren Antworten lieferte für mich aussagekräftige Ergebnisse: Bibliotheken ohne Debug-Symbole lieferten viel Ausgabe usw.

Velkan
quelle
Vielen Dank! Dies funktionierte für mich mit Clang Compiler in Android mit cmake :)
Pär Nils Amsen
super toll für eine schnelle Überprüfung! funktioniert auch mit * .o Objektdateien.
Stephane Rolland
28

nm -a <lib> druckt alle Symbole aus der Bibliothek, einschließlich der Debug-Symbole.

Sie können also die Ausgaben von nm <lib>und vergleichen nm -a <lib>- wenn sie sich unterscheiden, enthält Ihre Bibliothek einige Debug-Symbole.

qrdl
quelle
3
@Employed Russian Kannst du das bitte näher erläutern? Warum denkst du, ist es ein falsches Werkzeug? Es macht den Job und macht es auch unter Linux.
Qrdl
Selbst für Embedded Linux basierend auf Kernel 2.6.35, xxx-objdump, funktioniert xxx-nm einwandfrei.
agfe2
nm -ahat einen Alias, nm --debug-symsder selbsterklärend ist :-).
Pevik
3
Geben Sie einfach diff <(nm <lib>) <(nm -a <lib>)einen einfachen diff zu bekommen
Aᴄʜᴇʀᴏɴғᴀɪʟ
17

Unter OSX können Sie dsymutil -sund verwendendwarfdump .

Bei Verwendung von sehen dsymutil -s <lib_file> | moreSie Quelldateipfade in Dateien mit Debug-Symbolen, ansonsten jedoch nur die Funktionsnamen.

glennr
quelle
11
Können Sie beispielsweise erläutern, worauf bei der Ausgabe von zu achten ist dsymutil -s? Bedeutet das Vorhandensein einer Ausgabe, dass sie mit Debug-Symbolen erstellt wurde, oder sollte sie erfasst werden?
Mitch
12

Sie können hierfür objdump verwenden .

EDIT: Von der Manpage:

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

Antworten, die darauf hinweisen, dass Debug-Informationen in einer von der Binärdatei getrennten Datei gespeichert werden objdump --debuggingoder readelf --debug-dump=...nicht funktionieren, dh die Binärdatei enthält einen Debug-Link- Abschnitt. Vielleicht könnte man das einen Fehler nennen readelf.

Der folgende Code sollte dies korrekt behandeln:

# Test whether debug information is available for a given binary
has_debug_info() {
  readelf -S "$1" | grep -q " \(.debug_info\)\|\(.gnu_debuglink\) "
}

Weitere Informationen finden Sie unter Separate Debug-Dateien im GDB-Handbuch.

ack
quelle