Chinaunix首页 | 论坛 | 博客
  • 博客访问: 65333
  • 博文数量: 24
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 215
  • 用 户 组: 普通用户
  • 注册时间: 2015-02-10 09:58
个人简介

专业提供linux应用软件开发、oracle数据库底层开发,服务器开发及相关技术支持服务

文章分类

全部博文(24)

文章存档

2015年(24)

我的朋友

分类: LINUX

2015-03-02 10:40:26

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)状态。


小结:
最好使用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/

阅读(1874) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~