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 -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.
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.
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 -aha un alias nm --debug-symsche si spiega da sé :-).
diff <(nm <lib>) <(nm -a <lib>)per ottenere un diff facile
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.
dsymutil -s,? L'esistenza dell'output significa che è stato creato con simboli di debug o dovrebbe essere grepped?
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.
obdjump -W libereadelf -w lib. Quest'ultimo è più configurabile - vedere la manpage readelf (1).