Comment puis-je basculer entre différents processus fork () ed dans gdb?

Je débogue une telle application multi-processus,

Comment puis-je basculer entre les processus fork() ?

  1. Vous pouvez mettre le processus enfant en veille, puis y attacher une nouvelle instance de GDB. Le manuel de l’utilisateur GDB décrit ce processus de la manière suivante (c’est moi qui souligne):

    Sur la plupart des systèmes, gdb ne prend pas en charge les programmes de débogage qui créent des processus supplémentaires à l’aide de la fonction fork. Quand un programme forks, gdb continuera à déboguer le processus parent et le processus enfant s’exécutera sans entrave. Si vous avez défini un point d’arrêt dans un code que l’enfant exécute, il recevra un signal SIGTRAP qui (à moins qu’il ne capture le signal) le fera se terminer.

    Toutefois, si vous souhaitez déboguer le processus enfant, il existe une solution de contournement qui n’est pas trop pénible. Mettez un appel en veille dans le code que le processus enfant exécute après le fork. Il peut être utile de ne mettre en veille que si une certaine variable d’environnement est définie ou s’il existe un certain fichier, de sorte que le retard ne survienne pas nécessairement lorsque vous ne souhaitez pas exécuter gdb sur l’enfant. Pendant que l’enfant dort, utilisez le programme ps pour obtenir son ID de processus. Puis indiquez à gdb ( une nouvelle invocation de gdb si vous déboguez également le processus parent ) de se connecter au processus enfant (voir Attach). À partir de ce moment, vous pouvez déboguer le processus enfant comme tout autre processus auquel vous vous êtes attaché.

    En résumé, lorsque vous démarrez un programme que vous divulguez par la suite, GDB restra connecté au processus parent (vous pouvez toutefois suivre le processus enfant à la place, en utilisant set follow-fork-mode child ). En mettant en veille l’autre processus, vous pouvez également y connecter une nouvelle instance de GDB.

  2. Utilisez set detach-on-fork off pour tenir les deux processus sous le contrôle de gdb. Par défaut, le processus parent sera débogué comme d’habitude et le fils sera suspendu, mais en appelant set follow-fork-mode child vous pouvez modifier ce comportement (afin que le processus enfant soit débogué comme d’habitude et que le suspendu). Le manuel de l’utilisateur GDB décrit ce processus de la manière suivante:

    gdb conservera le contrôle de tous les processus forkés (y compris les forks nesteds). Vous pouvez répertorier les processus forkés sous le contrôle de gdb à l’aide de la commande info inferiors et basculer d’un fork à l’autre en utilisant la commande inferior (voir Débogage de plusieurs gestionnaires et programmes inférieurs ).

    Pour quitter le débogage d’un des processus forkés, vous pouvez soit vous en détacher à l’aide de la commande detach inferiors (lui permettant de s’exécuter indépendamment), soit le tuer à l’aide de la commande kill inferiors . Voir Débogage de plusieurs utilisateurs et programmes .