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 -g
no 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 -a
parece 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 -g
opción
Lo que realmente me ayudó a determinar si -g
se 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-dump
opció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 -a
tiene un alias nm --debug-syms
que se explica por sí mismo :-).
diff <(nm <lib>) <(nm -a <lib>)
para obtener una diferencia fácil
En OSX puede usar dsymutil -s
y 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 --debugging
o 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 lib
yreadelf -w lib
. El último es más configurable: consulte la página de manual de readelf (1).