web-dev-qa-db-fra.com

Débogage du processus enfant après fork (enfant en mode follow-fork configuré)

Je suis en train de développer une application dont le parent fourche un enfant pour gérer certaines tâches. J'ai un problème où j'ai configuré gdb pour suivre l'enfant en mode fork mais après fork, après avoir atteint un point d'arrêt, il envoie un SIGTRAP mais l'enfant se termine en quelque sorte et envoie SIGCHLD au parent.

J'ai configuré signal(SIGTRAP, SIG_IGN) avant fork donc ma compréhension est que l'enfant devrait hériter et ignorer SIGTRAP lorsque le point d'arrêt est atteint mais cela ne se produit pas.

S'il vous plaît, aidez-moi à comprendre cela si je me trompe.

Comment puis-je déboguer avec succès le processus enfant?

29
ihsan

Le processus enfant hérite des gestionnaires de signaux du parent, mais pas du signal en attente.

Après avoir forgé, essayez d'installer le gestionnaire de signal pour SIGTRAP à un endroit dans le code où le processus enfant s'exécute après avoir forgé. Si vous ne gérez pas SIGTRAP, l'action par défaut est que l'enfant est terminé.

Si vous souhaitez déboguer le processus enfant, vous devez utiliser follow-fork-mode. Vous devez définir le mode à l'aide de

set follow-fork-mode child

Cependant, seul l'enfant peut désormais être débogué et le parent s'exécute sans contrôle.

Il y a ne manière alternative de débogage du processus enfant.

Après l'exécution de fork(), placez un appel sleep() dans le code où l'enfant s'exécute, obtenez le PID de l'enfant à l'aide de l'utilitaire ps, puis attachez le PID.

attach <PID of child process>

Maintenant, vous pouvez déboguer le processus enfant, comme tout autre processus.

Après le débogage, vous pouvez détacher le PID à l'aide de

detach
75
Barath Ravikumar