Si ejecuto un programa desde el shell, y esto falla:
$ buggy_program
Segmentation fault
Sin embargo, me dirá, ¿hay alguna manera de hacer que los programas impriman una traza inversa, tal vez ejecutando algo como esto:
$ print_backtrace_if_segfault buggy_program
Segfault in main.c:35
(rest of the backtrace)
También prefiero no usar strace o ltrace para ese tipo de información, ya que se imprimirán de cualquier manera ...
Lamento venir aquí 2 años después ... tropecé mientras buscaba algo más. Agregando esto para completar.
1) Si bien creo que la respuesta aceptada es excelente, requiere gdb. El método con el que estoy familiarizado usa libSegFault.so.
Si ejecuta su aplicación con
Obtendría un informe con seguimiento, libs cargadas, etc.
2) También
catchsegv
está disponible un script de contenedor que intentaría usaraddr2line
para traducir direcciones a nombre de archivo + número de línea.Estas son soluciones mucho más ligeras que los archivos core o gdb (bueno para sistemas embebidos, por ejemplo)
fuente
LD_PRELOAD=libSegFault.so
está bien si está en la ruta dl.Necesitas el amigo de todos GDB
Una vez que haya cargado su archivo core, el comando 'backtrace' (puede abreviarse como bt) le dará la pila de llamadas actual. Si ejecuta su programa desde dentro de gdb, puede establecer puntos de interrupción arbitrarios y examinar el contenido de la memoria, etc.
fuente
catchsegv
Fue mencionado en otra respuesta (pero de ninguna manera se centró en). Es una herramienta práctica incluida en el proyecto glibc. Proporcionará una traza inversa (y otra información útil de depuración) solo si un programa realmente segfault.
Un buen artículo existe aquí .
Puede incluirlo en sus propios scripts como mejor le parezca.
fuente
Ubuntu (como proyecto) usa Apport para hacer esto. Puedes ver cómo lo hicieron.
https://wiki.ubuntu.com/Apport
fuente
/proc/sys/kernel/core_pattern
Aquí hay una variante ligeramente modificada del guión de Kyle Brandt. Se mejora de las siguientes maneras:
Guión:
fuente
-ex
en su lugar.gdb ... -ex 'set pagination off' -ex backtrace -ex quit