GNU/Linux >> Tutoriales Linux >  >> Linux

¿Puede obtener algún programa en Linux para imprimir un seguimiento de la pila si falla?

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


Linux
  1. ¿Cómo empezaste con Linux?

  2. Obtenga el código fuente para cualquier comando de Linux

  3. ¿Puedes hacerlo? Compile programas C en Linux usando el comando Make

  4. ¿Se pueden desarrollar aplicaciones Linux con Xamarin?

  5. ¿Puedes ver directamente un PDF malicioso en Linux?

Cómo rastrear la ejecución del programa usando el comando Strace de Linux

13 maneras en que puede ayudar a Linux

Las mejores revistas de Linux a las que puede suscribirse

¿Necesita Java? Entonces puedes instalarlo Java en Linux

¿Puedes superar esto? 15 ejemplos prácticos de comandos superiores de Linux

Viaje de un programa en C a un ejecutable de Linux en 4 etapas