gdb多线程/多进程(守护进程)调试

andylanzhiyong 2011-09-19

一调试多进程

1)follow-fork-mode:

setfollow-fork-mode[parent|child]

parent:fork之后继续调试父进程,子进程不受影响。

child:fork之后调试子进程,父进程不受影响。

在使用如下方法设置完要调试的程序后:

gdb命令行的–-args参数

gdb环境中setargs命令。

gdb--pid=PID(ps-ef|grepyour_prog)

如果需要调试子进程,在启动gdb后:

(gdb)setfollow-fork-modechild

并在子进程代码设置断点。

此外还有detach-on-fork参数,指示GDB在fork之后是否断开(detach)某个进程的调试,或者都交由GDB控制:

setdetach-on-fork[on|off]

on:断开调试follow-fork-mode指定的进程。

off:gdb将控制父进程和子进程。follow-fork-mode指定的进程将被调试,另一个进程置于暂停(suspended)状态。

由于follow-fork-mode的调试必然是从父进程开始的,对于fork多次,调试起来并不方便。

2)attach调试:

GDB有附着(attach)到正在运行的进程的功能,即attach<pid>命令。因此可以利用该命令attach到子进程然后进行调试。通过ps和pstree可以查看到所要调试的子进程pid。

问题是,子进程一直在运行,attach上去后都不知道运行到哪里了。一个办法是,在要调试的子进程初始代码中,加入一段特殊代码,使子进程在某个条件成立时便循环睡眠等待,attach到进程后在该代码段后设上断点,再把成立的条件取消,使代码可以继续执行下去。

Attach进程方法还是很方便的,它能够应付各种各样复杂的进程系统,比如孙子/曾孙进程,比如守护进程(daemonprocess),唯一需要的就是加入一小段代码。适合于各种复杂情况,特别是守护进程。

3)gdbwrapper:

专用于fork+exec模式,不用添加额外代码,但需要X环境支持(xterm/VNC)。

可参考:http://www.ibm.com/developerworks/cn/linux/l-cn-gdbmp/index.html

二调试多进程

GDB多线程调试的基本命令:

infothreads查看当前进程的线程。

thread<ID>切换调试的线程为指定ID的线程。

break[LOCATION][threadTHREADNUM][ifCONDITION]在[LOCATION]处为[threadTHREADNUM]设置断点在满足条件[ifCONDITION]时停住。

threadapplyID1ID2command让一个或者多个线程执行GDB命令command。

threadapplyallcommand让所有被调试线程执行GDB命令command。

setscheduler-lockingoff|on|step,这个是问得最多的。在使用step或者continue命令调试当前被调试线程的时候,其他线程也是同时执行的,怎么只让被调试程序执行呢?通过这个命令就可以实现这个需求。

off不锁定任何线程,也就是所有线程都执行,这是默认值。

on只有当前被调试程序会执行。

step在单步的时候,除了next过一个函数的情况(熟悉情况的人可能知道,这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行。

other:

gdb中的变量以$开头,比如你想打印一个数组中的个个元素,你可以这样:

(gdb)set$i=0

(gdb)pa[$i++]

调试宏:在GCC编译程序的时候,加上-ggdb3参数,就可以了

infomacro–你可以查看这个宏在哪些文件里被引用了,以及宏定义是什么样的。

macro–你可以查看宏展开的样子。

x命令是用来查看内存的,在gdb中“helpx”你可以查看其帮助。

x/x以十六进制输出

x/d以十进制输出

x/c以单字符输出

x/i反汇编–通常,我们会使用x/10i$ip-20来查看当前的汇编($ip是指令寄存器)

x/s以字符串输出

command命令,其就是把一组gdb的命令打包,有点像字处理软件的“宏”。

(gdb)command1

Typecommandsforwhenbreakpoint1ishit,oneperline.

Endwithalinesayingjust"end".

>printarg1

>printarg2

>printarg3

>end

(gdb)

参考:

http://www.ibm.com/developerworks/cn/linux/l-cn-gdbmp/index.html

http://coolshell.cn/articles/3643.html

相关推荐