c gdb signals fork

Proceso secundario de depuración después de la bifurcación(niño de follow-fork-mode configurado)



gdb signals (1)

Estoy desarrollando una aplicación en la que el padre de un niño se encarga de manejar ciertas tareas. Tengo un problema en el que configuré gdb para seguir al modo de bifurcación, pero después de la bifurcación, después de alcanzar un punto de interrupción, envía un SIGTRAP pero el niño de alguna manera termina y envía el SIGCHLD al padre.

He configurado la signal(SIGTRAP, SIG_IGN) antes de la bifurcación, por lo que entiendo que el hijo debe heredar e ignorar SIGTRAP cuando se alcanza el punto de interrupción pero no está sucediendo.

Por favor ayúdame a entender esto si soy incorrecto.

¿Cómo puedo depurar con éxito el proceso hijo?


El proceso hijo hereda los manejadores de señal del padre, pero no la señal pendiente.

Después de forking, intente instalar el manejador de señales para SIGTRAP en un lugar en el código donde el proceso hijo se ejecuta después del forking. Si no maneja SIGTRAP , la acción predeterminada es que el hijo se termine.

Si desea depurar el proceso hijo, debe utilizar el modo de follow-fork-mode . Debes configurar el modo usando

set follow-fork-mode child

Sin embargo, ahora solo se puede depurar el hijo y el padre se ejecuta sin marcar.

Hay una forma alternativa de depurar el proceso hijo.

Después de ejecutar fork() , ponga una llamada a sleep() en el código donde se ejecuta el niño, obtenga el PID del niño usando la utilidad ps , luego adjunte el PID.

attach <PID of child process>

Ahora, puede depurar el proceso hijo, como cualquier otro proceso.

Después de la depuración, puede separar el PID usando

detach