http://blog.163.com/redhumor@126/blog/static/1955478420108192540752/
在2.5.60版Linux内核及以后,GDB对使用fork/vfork创建子进程的程序提供了follow-fork-mode选项来支持多进程调试。
follow-fork-mode的用法为:
set follow-fork-mode [parent|child]
parent: fork之后继续调试父进程,子进程不受影响。
child: fork之后调试子进程,父进程不受影响。
因此如果需要调试子进程,在启动gdb后:
(gdb) set follow-fork-mode child |
并在子进程代码设置断点。------如何设置
此外还有detach-on-fork参数,指示GDB在fork之后是否断开(detach)某个进程的调试,或者都交由GDB控制:
set detach-on-fork [on|off]
on: 断开调试follow-fork-mode指定的进程。
off: gdb将控制父进程和子进程。follow-fork-mode指定的进程将被调试,另一个进程置于暂停(suspended)状态。
注意,最好使用GDB 6.6或以上版本,如果你使用的是GDB6.4,就只有follow-fork-mode模式。
follow-fork-mode/detach-on-fork的使用还是比较简单的,但由于其系统内核/gdb版本限制,我们只能在符合要求的系统上才能使用。而且,由于follow-fork-mode的调试必然是从父进程开始的,对于fork多次,以至于出现孙进程或曾孙进程的系统,例如上图3进程系统,调试起来并不方便。
上面这个方法不太理解,大家可以试试。
众所周知,GDB有附着(attach)到正在运行的进程的功能,即attach <pid>命令。因此我们可以利用该命令attach到子进程然后进行调试。
简单说在子进程中第一行加一段代码int flag =1; while(flag){}//空循环,目的是为了attach子进程的时候,子进程并没有运行真正的程序,
然后这个时候就可以看到子进程了,利用ps命令,查看子进程的Pid,然后在gdb中使用attach pid(子进程Pid),然后再使用set flag =0;这样子进程就可以正常调试了…… 很强大的方法啊。
还有第三种方法 叫wrapper,这个方法要X-window的支持,这里不介绍,我也不太会用---专用于 exec函数族的,所以总得来说还是attach方法最王道——虽然要添一行代码……