GDB默认只调试父进程,如果在子进程中打断点,那么子进程会接收SIGTRAP信号
调试前的配置
detach-on-fork:该属性决定了gdb是同时调试父子进程,还是在fork了子进程之后,将子进程分离出去。
On:子进程(或者是父进程,取决于gdb在初始时,要调试的进程,也就是follow-fork-mode的值)
Off:同时调试父子进程。一个进程处于被调试的状态,而另一个则被gdb挂起
follow-fork-mode:该属性决定了GDB在进程调用fork之后的行为。
set follow-fork-mode parent:默认情况下,在调用fork之后,gdb选择跟随(也就是调试)父进程,而子进程则处于运行状态(此时父进程处于阻塞状态)
set follow-fork-mode child:默认情况下,在调用fork之后,gdb选择跟随(也就是调试)子进程,而父进程则处于运行状态(此时进程处于阻塞状态)
info inferiors
查看当前进程
直接运行的话
可以看出来gdb只调试了一个进程,就是当前进程
让我按照上文关闭这个选项, set detach-on-fork off
再次run
可以看到父子进程都出现在了gdb的调试列表中
我们再测试一下set follow-fork-mode child
果然是子进程开始运行
如何终止进程的调试?
使用 detach inferiors Num
可以看到父进程已经成功地脱离了gdb
那么我们现在调试的只有子进程