Antworten:
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.
objdump -g
gibt 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 -a
scheint nützlicher zu sein.
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 -g
Option erstellt wurde
Was mir wirklich geholfen hat festzustellen, ob -g
es 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-dump
Option anstelle von erforderlich finden decodedline
.
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.
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.
nm -a
hat einen Alias, nm --debug-syms
der selbsterklärend ist :-).
diff <(nm <lib>) <(nm -a <lib>)
einen einfachen diff zu bekommen
Unter OSX können Sie dsymutil -s
und verwendendwarfdump
.
Bei Verwendung von sehen dsymutil -s <lib_file> | more
Sie Quelldateipfade in Dateien mit Debug-Symbolen, ansonsten jedoch nur die Funktionsnamen.
dsymutil -s
? Bedeutet das Vorhandensein einer Ausgabe, dass sie mit Debug-Symbolen erstellt wurde, oder sollte sie erfasst werden?
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.
Antworten, die darauf hinweisen, dass Debug-Informationen in einer von der Binärdatei getrennten Datei gespeichert werden objdump --debugging
oder 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.
obdjump -W lib
undreadelf -w lib
. Letzteres ist konfigurierbarer - siehe Readelf (1) Manpage.