python debugging elf dwarf

python - Biblioteca para leer información de depuración DWARF del archivo ELF



debugging (5)

Desafortunadamente, sus opciones para leer la información de depuración de DWARF son bastante limitadas.

Que yo sepa, solo hay una biblioteca de propósito general para analizar la información de depuración de DWARF y es libdwarf . Desafortunadamente, nadie ha escrito enlaces de Python para libdwarf (tal vez podrías asumirlo y compartirlo con todos los demás :)) Ciertamente, podrías intentar acceder a las funciones de la biblioteca utilizando ctypes o la API de Python C.

Sin embargo, una solución mucho menos elegante es utilizar un analizador DWARF existente y analizar la información textual que genera. Sus opciones para esto (en Linux) son

objdump -W readelf --debug-dump=[OPTIONS]

Actualmente utilizo un proyecto que se basa en la lectura y su soporte para la información de depuración DWARF es muy completo. Simplemente puede usar Python para ejecutar cualquiera de los comandos en el shell y luego analizar la información que necesite. Ciertamente no es tan ideal como una biblioteca, pero debería hacer el truco.

EDITAR: Noté en un comentario anterior que mencionaste Windows. Ambos programas (objdump y readelf) son parte de GNU-binutils, por lo que deberían estar disponibles con Cygwin o mingw.

¿Alguna recomendación para una buena biblioteca multiplataforma para leer información de depuración de archivos ELF en formato DWARF? Me gustaría leer la información de depuración DWARF en un programa de Python.


El concepto de "información de depuración ELF" no existe realmente: la especificación ELF deja el contenido de la sección .debug sin especificar deliberadamente.

Los formatos de depuración comunes son STAB y DWARF . Una biblioteca para leer DWARF es libdwarf .


Hay un nuevo niño en el bloque, pyelftools , una biblioteca de Python pura para analizar los formatos ELF y DWARF. Darle una oportunidad.

Su objetivo es ser completo y se encuentra actualmente en desarrollo activo, por lo que cualquier problema debe ser resuelto de manera rápida y con entusiasmo :-)


Podría estar interesado en la biblioteca DWARF de pydevtools :

>>> from devtools.dwarf import DWARF >>> dwarf = DWARF(''test/test'') >>> dwarf.get_loc_by_addr(0x8048475) (''/home/emilmont/Workspace/dbg/test/main.c'', 36, 0) >>> print dwarf .debug_info COMPILE_UNIT<header overall offset = 0> <0><11> compile_unit producer: GNU C 4.4.3 language: C89 name: a/test.c comp_dir: /home/emilmont/Workspace/dbg/test low_pc: 0x080483e4 high_pc: 0x08048410 stmt_list: 0 [...]