4.3.4. Forked Execution Among the more challenging bugs confronting programmers is where one program (the parent ) makes an independent copy of itself (a fork ). That fork then creates a child process which, in turn, fails. Debugging the parent process may or may not be useful. Often the only way to get to the bug may be by debugging the child process, but this is not always possible. The set follow-fork-mode feature is used to overcome this barrier allowing programmers to follow a a child process instead of the parent process. set follow-fork-mode parent The original process is debugged after a fork. The child process runs unimpeded. This is the default. set follow-fork-mode child The new process is debugged after a fork. The parent process runs unimpeded. show follow-fork-mode Display the current debugger response to a fork call. Use the set detach-on-fork command to debug both the parent and the child processes after a fork, or retain debugger control over them both. set detach-on-fork on The child process (or parent process, depending on the value of follow-fork-mode ) will be detached and allowed to run independently. This is the default. set detach-on-fork off Both processes will be held under the control of GDB. One process (child or parent, depending on the value of follow-fork-mode ) is debugged as usual, while the other is suspended. show detach-on-fork Show whether detach-on-fork mode is on or off. Consider the following program: fork.c #include <unistd.h> int main() { pid_t pid; const char *name; pid = fork(); if (pid == 0) { name = "I am the child"; } else { name = "I am the parent"; } return 0; } This program, compiled with the command gcc -g fork.c -o fork -lpthread and examined under GDB will show: gdb ./fork [...] (gdb) break main Breakpoint 1 at 0x4005dc: file fork.c, line 8. (gdb) run [...] Breakpoint 1, main () at fork.c:8 8 pid = fork(); (gdb) Detaching after fork from child process 3840. 9 if (pid == 0) (gdb) 15 name = "I am the parent"; (gdb) 17 return 0; (gdb) print name USD1 = 0x400717 "I am the parent" GDB followed the parent process and allowed the child process (process 3840) to continue execution. The following is the same test using set follow-fork-mode child . (gdb) set follow-fork-mode child (gdb) break main Breakpoint 1 at 0x4005dc: file fork.c, line 8. (gdb) run [...] Breakpoint 1, main () at fork.c:8 8 pid = fork(); (gdb) [New process 3875] [Thread debugging using libthread_db enabled] [Switching to Thread 0x7ffff7fd5720 (LWP 3875)] 9 if (pid == 0) (gdb) 11 name = "I am the child"; (gdb) 17 return 0; (gdb) print name USD2 = 0x400708 "I am the child" (gdb) GDB switched to the child process here. This can be permanent by adding the setting to the appropriate .gdbinit . For example, if set follow-fork-mode ask is added to ~/.gdbinit , then ask mode becomes the default mode.

Commands:
#include <unistd.h> int main() { pid_t pid; const char *name; pid = fork(); if (pid == 0) { name = "I am the child"; } else { name = "I am the parent"; } return 0; }
gdb ./fork [...] (gdb) break main Breakpoint 1 at 0x4005dc: file fork.c, line 8. (gdb) run [...] Breakpoint 1, main () at fork.c:8 8 pid = fork(); (gdb) next Detaching after fork from child process 3840. 9 if (pid == 0) (gdb) next 15 name = "I am the parent"; (gdb) next 17 return 0; (gdb) print name USD1 = 0x400717 "I am the parent"
(gdb) set follow-fork-mode child (gdb) break main Breakpoint 1 at 0x4005dc: file fork.c, line 8. (gdb) run [...] Breakpoint 1, main () at fork.c:8 8 pid = fork(); (gdb) next [New process 3875] [Thread debugging using libthread_db enabled] [Switching to Thread 0x7ffff7fd5720 (LWP 3875)] 9 if (pid == 0) (gdb) next 11 name = "I am the child"; (gdb) next 17 return 0; (gdb) print name USD2 = 0x400708 "I am the child" (gdb)