2010-07-13 10 views
8

Tengo un programa defectuoso que cuando se ejecuta recibe un SIGSEGV.Puede gdb adjuntar automáticamente un proceso en un SIGSEGV

puedo usar GDB como esto:

$ gdb ./prog 

Pero yo preferiría que GDB coger el SIGSEGV de prog y adjuntarlo automáticamente.

$ ./prog 
Segmentation Fault 
(gdb) ... 

¿Hay alguna manera de hacerlo?

Gracias

Respuesta

12

Hmm. Puede configurar un manejador de señal para iniciar el depurador con el proceso actual. De esta forma, puede inspeccionar todo el estado "en vivo".

#include <signal.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <stdlib.h> 

const char *prog=0; 
void fn(int signum) 
{ 

    char buf[256]; 
    snprintf(buf,255,"ddd %s %d",prog,getpid()); 
    system(buf); 
} 
int main(int argc, char **argv) 
{ 
    prog=argv[0]; 
    signal(SIGSEGV,&fn); 
    int *p=0; 
    int k=*p; 
} 

ACTUALIZACIÓN: Chaged de acuerdo con las sugerencias de miedwar y Fanatic23. Las distribuciones actuales de Ubuntu están configuradas para no permitir la depuración de procesos no secundarios. Ver https://askubuntu.com/questions/41629/after-upgrade-gdb-wont-attach-to-process para una solución.

+1

+1 es bueno saber que puede captar esta señal, por cierto, necesita una salida() después del sistema() por lo que no se ejecutará más de una vez. – miedwar

+1

El prototipo para fn necesita un argumento entero para obtener el código compilado. – Fanatic23

3

Bueno siempre se puede crear un archivo central y luego analizar la pila de llamadas usando GDB en ese núcleo. Puede consultar la página de manual de ulimit para hacerlo.

Check this link for more info.

1

Para agregar a la respuesta de Mainframe puede vincular su aplicación con libdebugme (o simplemente LD_PRELOAD) para lograr una funcionalidad similar. Por ejemplo:

DEBUGME_OPTIONS=handle_signals=1 LD_PRELOAD=libdebugme.so ./app 
Cuestiones relacionadas