Come posso sapere se una libreria è stata compilata con -g?


103

Ho alcune librerie compilate su x86 Linux e voglio determinare rapidamente se sono state compilate con simboli di debug.

Risposte:


85

Se stai usando Linux, usa objdump --debugging. Dovrebbe esserci una voce per ogni file oggetto nella libreria. Per i file oggetto senza simboli di debug, vedrai qualcosa di simile:

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

voidincr.o:     file format elf64-x86-64

Se sono presenti simboli di debug, l'output sarà molto più dettagliato.


5
Ci sono anche obdjump -W libe readelf -w lib. Quest'ultimo è più configurabile - vedere la manpage readelf (1).
przemoc

3
Per qualsiasi binario, (inclusi quelli compilati con -g) objdump mi dà la risposta di "nessuna informazione di debug riconosciuta" a meno che non lo compili con -gstabs. Questo sembra essere un bug riconosciuto.
Dan Hook

Dan, su quale piattaforma l'hai provato?
swegi

Russo impiegato: da man objdump (1), il flag --debugging "tenta di analizzare le informazioni sul formato di debug STABS e IEEE memorizzate nel file e stamparle usando una sintassi simile a C. Se nessuno di questi formati viene trovato questa opzione fallisce sull'opzione -W per stampare qualsiasi informazione DWARF nel file. "
Matt McClellan

5
objdump -gnon mi da nulla per un semplice test.o compilato sia con che senza g, rendendolo effettivamente inutile. Ubuntu 12.04, gcc 4.6.3, GNU objdump 2.22. nm -asembra essere più utile.
jw013

89

Il comando suggerito

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

mi dà sempre lo stesso risultato almeno su Ubuntu / Linaro 4.5.2:

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

non importa se l'archivio / libreria condivisa è stato creato con o senza -gopzione

Ciò che mi ha davvero aiutato a determinare se è -gstato utilizzato è lo strumento readelf :

readelf --debug-dump=decodedline libinspected.so

o

readelf --debug-dump=line libinspected.so

Questo stamperà un insieme di righe composto da nome del file sorgente, numero di riga e indirizzo se tali informazioni di debug sono incluse nella libreria , altrimenti non stamperà nulla .

Puoi passare qualsiasi valore tu ritenga necessario per l' --debug-dumpopzione invece di decodedline.


1
funziona perfettamente. Ho provato questo comando sul mio eseguibile con il primo CMAKE_BUILD_TYPE RELEASE e il comando è tornato vuoto. Poi ho provato con CMAKE_BUILD_TYPE DEBUG e poi ci sono stati parecchi output.
infocloggato il

32

Ciò che ha aiutato è:

gdb mylib.so

Stampa quando i simboli di debug non vengono trovati:

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

O una volta trovato:

Reading symbols from mylib.so...done.

Nessuna delle risposte precedenti stava dando risultati significativi per me: le librerie senza simboli di debug davano molto output, ecc.


Grazie! Questo ha funzionato per me, usando il compilatore clang in Android con cmake :)
Pär Nils Amsen

super ottimo per un controllo veloce! funziona anche su file oggetto * .o.
Stephane Rolland

28

nm -a <lib> stamperà tutti i simboli dalla libreria, inclusi quelli di debug.

Quindi puoi confrontare gli output di nm <lib>e nm -a <lib>- se differiscono, la tua libreria contiene alcuni simboli di debug.


3
@Occupati russi Puoi spiegarci meglio? Perché pensi che sia uno strumento sbagliato? Fa il lavoro e lo fa anche su Linux.
qrdl

Anche per Embedded Linux basato sul kernel 2.6.35, xxx-objdump, xxx-nm funziona bene.
agfe2

nm -aha un alias nm --debug-symsche si spiega da sé :-).
pevik

3
Basta digitare diff <(nm <lib>) <(nm -a <lib>)per ottenere un diff facile
Aᴄʜᴇʀᴏɴғᴀɪʟ

17

Su OSX puoi usare dsymutil -se dwarfdump.

Usando dsymutil -s <lib_file> | morevedrai i percorsi dei file di origine nei file che hanno simboli di debug, ma solo i nomi delle funzioni in caso contrario.


11
Potete fornire un'elaborazione su cosa cercare nell'output di, ad esempio dsymutil -s,? L'esistenza dell'output significa che è stato creato con simboli di debug o dovrebbe essere grepped?
Mitch

12

Puoi usare objdump per questo.

EDIT: dalla pagina man:

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

6

Risposte che suggeriscono l'uso objdump --debuggingo readelf --debug-dump=...meno nel caso in cui le informazioni di debug siano memorizzate in un file separato dal binario, ovvero il binario contiene una sezione di collegamento di debug . Forse si potrebbe chiamare questo un bug readelf.

Il codice seguente dovrebbe gestirlo correttamente:

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

Vedere Separare i file di debug nel manuale GDB per ulteriori informazioni.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.