2012-05-14 22 views
7

Me gustaría acceder a los marcos almacenados en un volcado del núcleo de un programa que no tiene símbolos de depuración (quiero hacer esto en C). Cuando abro el programa y el volcado del núcleo dentro de GDB obtengo un seguimiento de pila que incluye los nombres de las funciones. Por ejemplo:Cómo leer fotogramas de un volcado de memoria (sin GDB)?

(gdb) bt 
#0 0x08048443 in layer3() 
#1 0x08048489 in layer2() 
#2 0x080484c9 in layer1() 
#3 0x0804854e in main() 

Los nombres de todas las funciones se almacenan en el ejecutable en la sección .strtab. ¿Cómo puedo construir el seguimiento de la pila con los diferentes marcos? La ejecución de GDB en modo por lotes es no una opción. Y también simplemente "copiar las partes de gdb que se necesitan" también es una mala idea porque el código no está escrito de forma independiente.

Para hacer mi pregunta con mayor precisión: ¿Dónde encuentro el punto dentro de un volcado de memoria donde puedo comenzar a leer la información de la pila? ¿Hay alguna biblioteca de algún tipo para acceder a esa información? Una estructura que puedo usar? O mejor aún, ¿una documentación de cómo esas informaciones están estructuradas dentro de un volcado?

(I ya se ha visto la pregunta "how to generate a stack trace from a core dump file in C, without invoking an external tool such as gdb", pero dado que no hay una respuesta válida, pensé que iba a preguntar de nuevo)

[Editar] que estoy haciendo esto bajo Linux x86

+3

Windows, Linux o MacOS? x86, x86_64, PPC, Arm ....? – Flexo

+0

¡Dios mío, lo siento, lo olvidé! Linux, x86 – Uhlo

+0

http://www.kernel.org/doc/man-pages/online/pages/man5/core.5.html – Flexo

Respuesta

7

Coredump también contiene información de pila. Si puede usar esta información de la pila junto con los valores del registro EBP y EIP en el archivo coredump, puede imprimir el seguimiento de la pila. Yo había escrito un programa para hacer esto. Puede encontrar el programa en el siguiente enlace.

http://www.emntech.com/programs/corestrace.c 

Uso: Compile el programa anterior y proporcione el archivo central al ejecutarlo.

 $corestrace core 

Si desea símbolos también para ser impresas, lo hace de esta manera: Supongamos que el programa que genera el núcleo es 'prueba'.

 $ nm -n test > symbols 
     $ corestrace core symbols 

Salida de ejemplo es el siguiente:

 $ ./coretrace core symbols 

     0x80483cd foo+0x9 
     0x8048401 func+0x1f 
     0x8048430 main+0x2d 
+0

Eso ayudó mucho, ¡gracias! – Uhlo

+0

El enlace ya no funciona, pero encontré una copia en http://emntech.blogspot.com/2012/08/printing-backtracestack-trace-using.html – mephi42

+0

Se agregó una esencia para esto: https: //gist.github .com/root42/c979b037f85dc4b2be1f3735afedeb1d – Arne

Cuestiones relacionadas