Solución 1:
Puede que haya una forma mejor, pero esta la automatiza.
Pon lo siguiente en ~/backtrace
:
backtrace
quit
Pon esto en un script llamado seg_wrapper.sh
en un directorio en su ruta:
#!/bin/bash
ulimit -c unlimited
"[email protected]"
if [[ $? -eq 139 ]]; then
gdb -q $1 core -x ~/backtrace
fi
El ulimit
El comando hace que el núcleo se descargue. "[email protected]"
son los argumentos dados al script, por lo que sería su programa y sus argumentos. $?
mantiene el estado de salida, 139 parece ser el estado de salida predeterminado para mi máquina por un error de segmento.
Para gdb
, -q
significa tranquilo (sin mensaje de introducción), y -x
le dice a gdb
para ejecutar comandos en el archivo que se le ha dado.
Uso
Entonces, para usarlo, simplemente:
seg_wrapper.sh ./mycommand and its arguments
Actualizar
También puede escribir un controlador de señal que haga esto, vea este enlace.
Solución 2:
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
LD_PRELOAD=...ruta-a.../libSegFault.so myapp
Obtendría un informe con backtrace, bibliotecas cargadas, etc.
2) Un guión contenedor catchsegv
también está disponible que intentaría usar addr2line
para traducir direcciones a nombre de archivo + número de línea.
Estas son soluciones mucho más livianas que los archivos centrales o gdb (bueno para sistemas integrados, por ejemplo)
Solución 3:
Necesitas el GDB amigo de todos
gdb <program> [core file]
Una vez que haya cargado su archivo central, 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.
Solución 4:
catchsegv
Se mencionó en otra respuesta (pero de ninguna manera se centró). Es una herramienta útil incluida con el proyecto glibc. Proporcionará un seguimiento (y otra información de depuración útil) solo si un programa de hecho falla de segmento.
Existe un buen artículo aquí.
Puede incluirlo en sus propios scripts como mejor le parezca.
Solución 5:
Ubuntu (como proyecto) usa Apport para hacer esto. Puedes ver cómo lo hicieron.
https://wiki.ubuntu.com/Aportar