Debug fork() en eclipse cdt
gdb eclipse-cdt (3)
Estoy intentando depurar algún mecanismo fork () con eclipse cdt (Juno). Escribí el programa en C.
if( -1 == (pid = fork()) ) /* error */
goto cleanup;
else if ( 0 == pid ) /* child */
{
execlp("gcc", "gcc", cFilePath, "-o" , GCC_OUTPUT_FILE_NAME, NULL);
goto cleanup; /* Arrives here only on error! */
}
else if (pid > 0) /* parent - checks: correct pid returns, returns normally, with exit status = 0*/
{
returnedpid = wait(exitStatus);
if( pid != returnedpid || exitStatus == NULL || !WIFEXITED(*exitStatus) || !WEXITSTATUS(*exitStatus) )
goto cleanup;
}
Traté de agregar " set follow-fork-mode child
" como se dice aquí: http://unix.derkeiler.com/Newsgroups/comp.unix.programmer/2006-02/msg00435.html
1. ¿Cómo puedo depurar la sección del código donde (0==pid)
?
2. Cuando llego al enunciado de espera, el depurador acaba de regresar inmediatamente, ¿no es esperar () para suspender hasta que el niño regrese? ¿Por qué regresa inmediatamente?
- En la ventana de configuración de depuración -> Depurador -> Marque "Depurar automáticamente procesos bifurcados"
- Abrir ventana de punto de interrupción -> Ver menú -> Agregar punto de interrupción de evento C / C ++ -> "fork llamado"
- Ahora, una vez que se produjo el punto de interrupción del evento, presione F6 -> verá un nuevo proceso en la ventana de depuración
- Elija un nuevo proceso y presione F6 - Usted está en el niño
- Disfrutar
Puede ser porque el proceso init cosecha al niño antes de ir a esperar. Intenta bloquear sigchld a medida que avanzas en la horquilla y luego desbloquea las señales después de tus horquillas / ejecutivos. Tal vez eso debería darte una idea de lo que está sucediendo exactamente.
Usar sigprocmask debería ayudarte.
Sus problemas probablemente se deben a que el "detach-on-fork" está apagado. DSF establece esto por defecto (también es el predeterminado de gdb).
1) Coloque un punto de interrupción en las líneas con "execlp ..." y "returnedpid = ...". 2) En la configuración de depuración habilite el "modo non-stop" y "depure automáticamente el proceso bifurcado". 3) Inicia la sesión de depuración. Llegarás a un punto de interrupción en el niño o en el padre. Ahora ve la vista de depuración.
Notarás que tu binario muestra dos hilos.
4) Haga clic en una u otra (líneas con main () en la imagen de arriba) para cambiar el contexto de depuración.