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.

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.


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.


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.


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.


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.


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.

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.