2012-03-04 17 views
6

Tengo una aplicación que realiza un proceso secundario.GDB backtrace en el proceso secundario

El proceso hijo hace algo de trabajo y en algún punto intermedio da un fallo de segmentación. Solía ​​GDB para depurar este, he utilizado:

set follow-fork-mode child 

también han establecido un punto de interrupción a una función dentro del niño. Pero GDB no se detiene en mi punto crítico.

También el proceso principal maneja el seg-fault, así que tuve que ctrl-c para salir. A continuación, cuando uso backtrace para imprimir la pila todo lo que tengo es

Sin pila

¿Por qué es el punto de interrupción no se establece y por qué no me da la pila?

+0

es el programa infantil escrita por usted? – sirgeorge

+0

no, pero tengo la fuente conmigo. – broun

+0

¿Se puede construir (el elemento secundario) desde la fuente en modo de depuración? – sirgeorge

Respuesta

7

Por qué no es el punto de interrupción se establece

El punto de ruptura es está establecido, pero no está siendo golpeado porque ...

y por qué no he recibido ¿la pila?

... aparentemente está depurando el proceso incorrecto.

Con set follow-fork-mode child, GDB seguirá el primer niño que cree. Tal vez crees más de uno?

Una forma de solucionar esto es establecer un controlador SIGSEGV utilizando signal o sigaction.

En el controlador, haga lo siguiente:

void handler(int signo) 
{ 
    int i = 1; 
    fprintf(stderr, "pid=%d, got signal=%d\n", getpid(), signo); 
    while (i) { } 
} 

Una vez que vea el mensaje impreso, en otra ventana:

gdb /proc/<pid>/exe <pid> 
(gdb) where 
+0

gracias señor. –

Cuestiones relacionadas