Déboguer fork () dans cdt eclipse

J’essaie de déboguer un mécanisme fork () avec eclipse cdt (Juno). J’ai écrit le programme 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; } 

J’ai essayé d’append ” set follow-fork-mode child ” comme indiqué ici: http://unix.derkeiler.com/Newsgroups/comp.unix.programmer/2006-02/msg00435.html

1. Comment puis-je déboguer la section de code où (0==pid) ?

2. Lorsque j’arrive à l’instruction wait, le débogueur revient immédiatement, n’est-il pas supposé attendre () supposé suspendre jusqu’au retour de l’enfant? Pourquoi est-il revenir immédiatement?

Vos problèmes sont probablement dus à la désactivation de “détachement sur fourche”. DSF définit ceci par défaut (c’est aussi celui de gdb).

1) Placez un point d’arrêt sur les lignes avec “execlp …” et “returnpid = …”. 2) Dans la configuration de débogage, activez le “mode non-stop” et le “processus de débogage automatiquement débité”. 3) Démarrer la session de débogage. Vous atteindrez un point d’arrêt chez l’enfant ou chez le parent. Maintenant, voyez la vue de débogage.

Vue de débogage

Vous remarquerez que votre binary montre deux threads.

4) Cliquez sur l’un ou l’autre (lignes avec main () dans l’image ci-dessus) pour changer le contexte de débogage.

C’est peut-être parce que le processus init récupère l’enfant avant que vous n’attendiez. Essayez de bloquer sigchld en allant dans fork, puis débloquez les signaux après vos forks / execs. Cela devrait peut-être vous donner une idée de ce qui se passe exactement.

L’utilisation de sigprocmask devrait vous aider.

  1. Dans la fenêtre de configuration du débogage -> Débogueur -> Cochez la case “Débogage automatique des processus”
  2. Ouvrir la fenêtre des points d’arrêt -> Menu Affichage -> Ajouter un événement Point d’arrêt C / C ++ -> “fork”
  3. Maintenant, une fois que le point d’arrêt de l’événement s’est produit, appuyez sur F6 -> vous verrez le nouveau processus dans la fenêtre de débogage
  4. Choisissez un nouveau processus et appuyez sur F6 – Vous êtes dans l’enfant
  5. Prendre plaisir