c eclipse gdb fork eclipse-cdt

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?


  1. En la ventana de configuración de depuración -> Depurador -> Marque "Depurar automáticamente procesos bifurcados"
  2. Abrir ventana de punto de interrupción -> Ver menú -> Agregar punto de interrupción de evento C / C ++ -> "fork llamado"
  3. 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
  4. Elija un nuevo proceso y presione F6 - Usted está en el niño
  5. 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.