c debugging gdb debug-symbols

¿Cómo puedo saber si una biblioteca fue compilada con-g?



debugging gdb (7)

El comando sugerido

objdump --debugging libinspected.a objdump --debugging libinspected.so

me da siempre 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 / la biblioteca compartida se creó con o sin la opción -g

Lo que realmente me ayudó a determinar si se usó -g es readelf herramienta readelf :

readelf --debug-dump=decodedline libinspected.so

o

readelf --debug-dump=line libinspected.so

Esto imprimirá un conjunto de líneas que consiste en el nombre del archivo fuente, el número de línea y la dirección si dicha información de depuración está incluida en la biblioteca , de lo contrario no imprimirá nada .

Puedes pasar cualquier valor que encuentres necesario para la opción --debug-dump lugar de decodedline .

Tengo algunas librerías compiladas en x86 Linux y quiero determinar rápidamente si fueron compiladas con símbolos de depuración.


En OSX puedes usar dsymutil -s y dwarfdump .


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 uno podría llamar a eso un error en readelf .

El siguiente código debe 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 Separate Debug Files en el manual de GDB para obtener más información.


Lo que ayudó fue:

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 estaba dando resultados significativos para mí: las librerías sin símbolos de depuración daban muchos resultados, etc.


Puedes usar objdump para esto.

EDITAR: Desde la página de manual:

-W --dwarf Displays the contents of the DWARF debug sections in the file, if any are present.


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.


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.