用GDB调试多进程方法总结(perfect)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/happylzs2008/article/details/102693362

http://blog.chinaunix.net/uid-29094695-id-4851296.html

https://www.cnblogs.com/thammer/p/5833935.html

GDB是linux开发中最常用的代码调试工具,功能十分强大,本文简单介绍几种用GDB调试多进程代码的方法。

多进程调试确切指父子进程间的调试。实际上,GDB 没有对多进程程序调试提供直接支持。
例如,使用GDB调试某个进程,如果该进程fork了子进程,GDB会继续调试该进程,子进程会不受干扰地运行下去。
如果你事先在子进程代码里设定了断点,子进程会收到SIGTRAP信号并终止。
那么该如何调试子进程呢?其实我们可以利用GDB的特点或者其他一些辅助手段来达到目的。


1,Attach子进程
GDB有附着(attach)到正在运行的进程的功能,即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)状态。
 

// ---------------------------------------- insert  ----------------------------------------------//

https://www.cnblogs.com/thammer/p/5833935.html

使用gdb调试多进程时,如果想要在进程间进行切换,那么就需要在fork调用前设置: set detach-on-fork off ,然后使用 info inferiors 来查看进程信息,得到的信息可以看到最前面有一个进程编号,使用 inferior num 来进行进程切换。

// ---------------------------------------- insert  ----------------------------------------------//
小结:
最好使用GDB 6.6或以上版本,如果你使用的是GDB6.4,就只有follow-fork-mode模式。
follow-fork-mode/detach-on-fork的使用还是比较简单的,但由于其系统内核/gdb版本限制,我们只能在符合要求的系统上才能使用。


3,gdb wrapper
很多时候,父进程 fork 出子进程,子进程会紧接着调用 exec族函数来执行新的代码。对于这种情况,我们也可以使用gdb wrapper 方法。
它的优点是不用添加额外代码。具体使用方式请参照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

猜你喜欢

转载自blog.csdn.net/happylzs2008/article/details/102693362