用GDB调试多进程方法总结
GDB是linux开发中最常用的代码调试工具,功能十分强大,本文简单介绍几种用GDB调试多进程代码的方法。
多进程调试确切指父子进程间的调试。实际上,GDB 没有对多进程程序调试提供直接支持。
例如,使用GDB调试某个进程,如果该进程fork了子进程,GDB会继续调试该进程,子进程会不受干扰地运行下去。
如果你事先在子进程代码里设定了断点,子进程会收到SIGTRAP信号并终止。
那么该如何调试子进程呢?其实我们可以利用GDB的特点或者其他一些辅助手段来达到目的。
1,Attach子进程
GDB有附着(attach)到正在运行的进程的功能,即attach
不过这种方法必须首先在子进程开始处设置睡眠代码(sleep(10)),然后进入后台执行。经PS得到要调试子进程的PID,然后再执行“attach
例如:
$./ldw & //使进程ldw在后台运行
$ps -ef | grep ldw //查看进程pid
结果中类似下面的形式:
XXX 12345 23456 ———————————————— ./ldw //父进程
XXX 12346 12345 ———————————————— ./ldw //子进程,这里的第一个数字就是子进程pid
小结:
在要调试的子进程初始代码中,比如main函数开始处,加入一段特殊代码,使子进程在某个条件成立时便循环睡眠等待,attach到进程后在该代码段后设上断点,再把成立的条件取消,使代码可以继续执行下去。
Attach进程方法还是很方便的,它能够应付各种各样复杂的进程系统,比如孙子/曾孙进程,比如守护进程(daemon process),唯一需要的就是加入一小段代码。
2,follow-fork-mode/detach-on-fork
在2.5.60版Linux内核及以后,GDB对使用fork/vfork创建子进程的程序提供了follow-fork-mode选项来支持多进程调试
follow-fork-mode:设置调试哪个进程,需要在启动GDB之后使用。用法如下:
set follow-fork-mode [parent|child]
set follow-fork-mode parent--调试父进程,子进程不受影响。
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版本限制,我们只能在符合要求的系统上才能使用。
3,gdb wrapper
很多时候,父进程 fork 出子进程,子进程会紧接着调用 exec族函数来执行新的代码。对于这种情况,我们也可以使用gdb wrapper 方法。
它的优点是不用添加额外代码。具体使用方式请参照[url]http://www.ibm.com/developerworks/cn/linux/l-cn-gdbmp/
参考博客:
http://www.ibm.com/developerworks/cn/linux/l-cn-gdbmp/
http://www.linuxidc.com/Linux/2014-08/104993.htm