Risposte:
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.
objdump -g
non 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 -a
sembra essere più utile.
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 -g
opzione
Ciò che mi ha davvero aiutato a determinare se è -g
stato 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-dump
opzione invece di decodedline
.
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.
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.
nm -a
ha un alias nm --debug-syms
che si spiega da sé :-).
diff <(nm <lib>) <(nm -a <lib>)
per ottenere un diff facile
Su OSX puoi usare dsymutil -s
e dwarfdump
.
Usando dsymutil -s <lib_file> | more
vedrai i percorsi dei file di origine nei file che hanno simboli di debug, ma solo i nomi delle funzioni in caso contrario.
dsymutil -s
,? L'esistenza dell'output significa che è stato creato con simboli di debug o dovrebbe essere grepped?
Risposte che suggeriscono l'uso objdump --debugging
o 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.
obdjump -W lib
ereadelf -w lib
. Quest'ultimo è più configurabile - vedere la manpage readelf (1).