2017-02-03 3 views
0

Ce que j'essaie de faire est de fork un processus, exécutez un nouvel exécutable dans le processus fils, laissez le parent se terminer et attacher au processus enfant par GDB pour déboguer ce processus enfant. La raison pour laquelle j'utilise un processus parent initial pour forker un processus enfant (debuggable) est que je veux définir des propriétés d'environnement pour ce processus fils qui nécessite des appels système dans le noyau linux et ne veut pas modifier la GDB pour le faire . J'ai essayé et trouvé que je peux attacher au processus enfant via GDB après que le processus parent s'est terminé, mais dans ce cas l'enfant est déjà en cours d'exécution après l'appel système exec(). Le problème est que je ne peux pas utiliser ptrace (PTRACE_TRACEME) pour l'enfant, ce qui le fait s'arrêter à la première instruction car dans ce cas, GDB ne peut pas s'y attacher, car il est déjà tracé par son parent. Comment puis-je arrêter le processus enfant après avoir configuré son environnement afin qu'il soit arrêté à sa première instruction quand je fais exec()?Comment puis-je arrêter un processus fils à la première instruction du programme nouvellement exécuté après exec()?

Répondre

0

J'ai trouvé un moyen qui répondait à mes besoins et je le poste car il pourrait être utile à quelqu'un d'autre. Après avoir forgé, mettre en place l'environnement nécessaire, juste avant d'exécuter le programme à déboguer, envoyer un signal d'arrêt à lui-même {kill (getpid(), SIGSTOP)}. Laissez le parent ne pas attendre le processus de l'enfant et se terminer. Alors qu'il n'y a qu'un seul pid. Ouvrez GDB en y attachant en utilisant "gdb -p pid". Le signal d'arrêt sera transmis à GDB. Continuez le processus en donnant la commande sig 0 à l'invite GDB. Le processus fils continuera et exécute le programme débogable ensuite et vous pouvez le déboguer normalement maintenant.