Respuestas:
Si está ejecutando en Linux, use objdump --debugging. Debe haber una entrada para cada archivo de objeto en la biblioteca. Para archivos de objeto sin símbolos de depuración, verá algo como:
objdump --debugging libvoidincr.a
In archive libvoidincr.a:
voidincr.o: file format elf64-x86-64
Si hay símbolos de depuración, la salida será mucho más detallada.
objdump -gno me da nada para una prueba simple. o compilado con y sin g, lo que lo hace efectivamente inútil. Ubuntu 12.04, gcc 4.6.3, GNU objdump 2.22. nm -aparece ser más útil.
El comando sugerido
objdump --debugging libinspected.a
objdump --debugging libinspected.so
siempre me da el mismo resultado al menos en Ubuntu / Linaro 4.5.2:
libinspected.a: file format elf64-x86-64
libinspected.so: file format elf64-x86-64
no importa si el archivo / biblioteca compartida se creó con o sin -gopción
Lo que realmente me ayudó a determinar si -gse usó es la herramienta readelf :
readelf --debug-dump=decodedline libinspected.so
o
readelf --debug-dump=line libinspected.so
Esto imprimirá un conjunto de líneas que consta de nombre de archivo de origen, número de línea y dirección si dicha información de depuración se incluye en la biblioteca ; de lo contrario, no imprimirá nada .
Puede pasar cualquier valor que considere necesario para la --debug-dumpopción en lugar de decodedline.
Lo que ayudó es:
gdb mylib.so
Se imprime cuando no se encuentran los símbolos de depuración:
Reading symbols from mylib.so...(no debugging symbols found)...done.
O cuando se encuentra:
Reading symbols from mylib.so...done.
Ninguna de las respuestas anteriores me dio resultados significativos: las bibliotecas sin símbolos de depuración estaban dando muchos resultados, etc.
nm -a <lib> imprimirá todos los símbolos de la biblioteca, incluidos los de depuración.
Entonces puede comparar las salidas de nm <lib>y nm -a <lib>, si difieren, su lib contiene algunos símbolos de depuración.
nm -atiene un alias nm --debug-symsque se explica por sí mismo :-).
diff <(nm <lib>) <(nm -a <lib>)para obtener una diferencia fácil
En OSX puede usar dsymutil -sy dwarfdump.
Al usar dsymutil -s <lib_file> | more, verá las rutas de los archivos de origen en los archivos que tienen símbolos de depuración, pero solo los nombres de las funciones.
dsymutil -s,? ¿La existencia de la salida significa que se construyó con símbolos de depuración o debería ser grepped?
Las respuestas que sugieren el uso de objdump --debuggingo readelf --debug-dump=...no funcionan en el caso de que la información de depuración se almacene en un archivo separado del binario, es decir, el binario contiene una sección de enlace de depuración . Quizás se podría llamar a eso un error readelf.
El siguiente código debería manejar esto correctamente:
# Test whether debug information is available for a given binary
has_debug_info() {
readelf -S "$1" | grep -q " \(.debug_info\)\|\(.gnu_debuglink\) "
}
Consulte Archivos de depuración separados en el manual de GDB para obtener más información.
obdjump -W libyreadelf -w lib. El último es más configurable: consulte la página de manual de readelf (1).