Tengo algunas bibliotecas compiladas en x86 Linux y quiero determinar rápidamente si se compilaron con símbolos de depuración.
c
debugging
gdb
debug-symbols
Dan Hook
fuente
fuente
obdjump -W lib
yreadelf -w lib
. El último es más configurable: consulte la página de manual de readelf (1).objdump -g
no me da nada para una prueba simple. o compilado con y sing
, 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
siempre me da el mismo resultado al menos en Ubuntu / Linaro 4.5.2:
no importa si el archivo / biblioteca compartida se creó con o sin
-g
opciónLo que realmente me ayudó a determinar si
-g
se usó es la herramienta readelf :o
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 dedecodedline
.fuente
Lo que ayudó es:
Se imprime cuando no se encuentran los símbolos de depuración:
O cuando se encuentra:
Ninguna de las respuestas anteriores me dio resultados significativos: las bibliotecas sin símbolos de depuración estaban dando muchos resultados, etc.
fuente
nm -a <lib>
imprimirá todos los símbolos de la biblioteca, incluidos los de depuración.Entonces puede comparar las salidas de
nm <lib>
ynm -a <lib>
, si difieren, su lib contiene algunos símbolos de depuración.fuente
nm -a
tiene un aliasnm --debug-syms
que se explica por sí mismo :-).diff <(nm <lib>) <(nm -a <lib>)
para obtener una diferencia fácilEn OSX puede usar
dsymutil -s
ydwarfdump
.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.fuente
dsymutil -s
,? ¿La existencia de la salida significa que se construyó con símbolos de depuración o debería ser grepped?Puede usar objdump para esto.
EDITAR: Desde la página de manual:
fuente
Las respuestas que sugieren el uso de
objdump --debugging
oreadelf --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 errorreadelf
.El siguiente código debería manejar esto correctamente:
Consulte Archivos de depuración separados en el manual de GDB para obtener más información.
fuente