在使用 GDB(GNU 调试器)调试程序时,fork()
可能会引起一些困扰,主要是因为 fork()
创建了新的子进程,而 GDB 默认只会跟踪一个进程。这可能会导致以下问题:
- 调试子进程: 默认情况下,GDB 会在调试器中继续跟踪父进程,而不是新创建的子进程。这就意味着如果想要调试子进程,需要手动在 GDB 中切换到子进程。可以使用
set follow-fork-mode
命令来控制 GDB 如何处理fork()
调用,比如可以设置set follow-fork-mode child
让 GDB 在fork()
调用时跟踪子进程。 - 断点和状态同步: 当父进程调用
fork()
创建子进程时,GDB 的断点和状态可能会出现不同步的情况。比如,在子进程中可能会存在父进程设置的断点,而这些断点在默认情况下可能不会自动同步到子进程中。需要手动设置断点或者在子进程中执行exec
命令来重新加载程序。 - 进程管理: 如果程序中有多次
fork()
调用,可能会涉及到多个子进程,而 GDB 默认只会跟踪一个进程。这就需要开发者手动切换到不同的进程进行调试。
总的来说,fork()
在 GDB 中的困扰主要是与进程管理、断点同步以及调试模式切换相关的问题
使用gdb调试的时候,gdb只能跟踪一个进程。可以在fork函数调用之前,通过指令设置gdb调试工具跟踪父进程或子进程。默认情况下gdb是跟踪父进程的。
show follow-fork-mode : 查看目前的跟踪模式。 set follow-fork-mode child : 命令设置gdb在fork之后跟踪子进程。 set follow-fork-mode parent : 设置跟踪父进程。 show detach-on-fork : 显示了目前是的detach-on-fork模式 set detach-on-fork on : 只调试父进程或子进程的其中一个(根据follow-fork-mode来决定),这是默认的模式。 set detach-on-fork off : 父子进程都在gdb的控制之下,其中一个进程正常调试(根据follow-fork-mode来决定),另一个进程会被设置为暂停状态。
(gdb) set follow-fork-mode child (gdb) set detach-on-fork off (gdb) info functions