2009-07-09 11 views

Respuesta

21

Hay un nuevo chico en el bloque - pyelftools - una biblioteca de Python puro para analizar los formatos ELF y enano. Darle una oportunidad.

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

10

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

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

+0

Sí, es verdad. DWARF es lo que me interesa. –

+1

Actualicé la pregunta en consecuencia. –

+1

Es libdwarf multiplataforma, ¿sabes? La página no dice, pero parece tener un sabor Unix general. –

5

Usted puede encontrar aquí informaciones útiles:

+0

Gracias, me perdí esa otra pregunta, porque no estaba buscando "DWARF". Actualizaré el título de esta pregunta. –

4

Sus opciones para leer la información de depuración DWARF son por desgracia bastante limitada.

Por lo que sé, solo hay una biblioteca de propósito general para analizar la información de depuración de DWARF y es libdwarf. Lamentablemente, nadie ha escrito enlaces de Python para libdwarf (tal vez podría abordarlo y compartirlo con todos los demás :)) Sin duda podría intentar acceder a las funciones de la biblioteca utilizando ctypes o Python C API.

Una solución mucho menos elegante, sin embargo, es usar un analizador DWARF existente y analizar la información textual que genera. Sus opciones para este (en Linux) son

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

Actualmente utilizo un proyecto que se construye fuera de readelf y es el apoyo a la información de depuración DWARF se ofrece muy completo. Simplemente podría 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 ser el truco.

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

+0

allí es 'dwarfdump', también. – hochl

7

Quizás se encuentre interesado en el enano de la biblioteca 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 
[...] 
+0

Eso es genial de saber. Un par de preguntas: 1) ¿Qué plataformas son compatibles (Windows, Linux)? 2) ¿Puedes ponerlo en [PyPI] (http://pypi.python.org/pypi)? –

+0

Está en PyPI: http://pypi.python.org/pypi/BinTools/0.1.0 – emilmont

+0

¡Genial! La documentación no menciona plataformas compatibles. ¿Funciona en Windows? –

Cuestiones relacionadas