2013-02-28 14 views
22

Sto sviluppando un'applicazione che il genitore forchetta un figlio per gestire determinate attività. Sto riscontrando un problema in cui ho configurato gdb in modalità follow-fork-mode, ma dopo il fork, dopo aver raggiunto un breakpoint, invia un SIGTRAP ma il bambino in qualche modo termina e invia SIGCHLD al genitore.gdb debug del processo figlio dopo il fork (modalità figlio in modalità follow-fork configurata)

Ho configurato signal(SIGTRAP, SIG_IGN) prima di fork, quindi la mia comprensione è che il figlio deve ereditare e ignorare SIGTRAP quando viene raggiunto il punto di interruzione ma non sta succedendo.

Per favore aiutami a capire questo se non sono corretto.

Come è possibile eseguire correttamente il debug del processo figlio?

+2

"* ... dopo aver raggiunto un punto di interruzione, invia un SIGTRAP ... *" questo è il modo in cui il debugger viene notificato il punto di interruzione. "* ... il bambino in qualche modo termina ... *" termina normalmente o in modo anomalo? Puoi usare 'WIFEXITED (status)' sul valore restituito da 'wait [...] ([...,] & status [, ...])' nel genitore per verificarlo. Vedi 'man 3 wait' per i dettagli. – alk

risposta

59

Il processo figlio eredita i gestori di segnale dal genitore, ma non il segnale in sospeso.

Dopo aver biforcato, provare a installare il gestore di segnale per SIGTRAP in un punto nel codice in cui il processo figlio viene eseguito dopo la foratura. Se non si gestisce SIGTRAP, l'azione predefinita è che il figlio viene terminato.

Se si desidera eseguire il debug del processo figlio, è necessario utilizzare follow-fork-mode. È necessario impostare la modalità tramite

set follow-fork-mode child 

Tuttavia, ora solo il bambino può eseguire il debug, e il genitore corre incontrollato.

Esiste un altro modo di eseguire il debug del processo secondario.

Dopo fork() viene eseguita, mettere una chiamata sleep() nel codice in cui il bambino viene eseguito, ottenere il PID del bambino utilizzando l'utilità ps, quindi collegare il PID.

attach <PID of child process> 

Ora è possibile eseguire il debug del processo figlio, come qualsiasi altro processo.

dopo il debug, è possibile staccare il PID utilizzando

detach 
Problemi correlati