此内容没有您所选择的语言版本。
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) 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 $1 = 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) 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 $2 = 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.