红联Linux门户
Linux帮助

linux gdb调试多线程多进程显示宏

发布时间:2015-10-15 09:41:29来源:linux网站作者:yangzhenzhen

一、gdb调试多线程

gdb)info thread 查看当前进程的线程。

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

gdb)break file.c:100 thread all  在file.c文件第100行处为所有经过这里的线程设置断点。

gdb)set scheduler-locking off|on|step。在使用step或者continue命令调试当前被调试线程的时候,其他线程也是同时执行的,怎么只让被调试程序执行呢?通过这个命令就可以实现这个需求。off 不锁定任何线程,也就是所有线程都执行,这是默认值。 on 只有当前被调试程序会执行。step 在单步的时候,除了next过一个函数的情况(熟悉情况的人可能知道,这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行。

gdb)thread apply ID1 ID2 command 让线程id号为ID1,ID2执行GDB的  continue,break,step,next等命令。

gdb)thread apply all command 让所有被调试线程执行GDB的 continue,break,step,next等命令。


二、gdb调试多进程

1、follow-fork-mode方法

这是一种比较简单的方式,通过set follow-fork-mode的方式来调试父进程或子进程

2、attach的方式,这种应该是比较常用的方式,也是很多文章中介绍的一种方式。这种方式一般需要增加一些代码来实现对进程的attach

下面只介绍follow-fork-mode方法

在程序fork之前输入

gdb)set follow-fork-mode [parent|child]

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调试宏

在GDB下,我们无法print宏定义,因为宏是预编译的。但是我们还是有办法来调试宏,这个需要GCC的配合。

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

另外,你可以使用下述的GDB的宏调试命令 来查看相关的宏。

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


四、条件断点

条件断点

条件断点是语法是:break  [where] if [condition],这种断点真是非常管用。尤其是在一个循环或递归中,或是要监视某个变量。注意,这个设置是在GDB中的,只不过每经过那个断点时GDB会帮你检查一下条件是否满足。


Linux下建立arm-gdb调试环境:http://www.linuxdiyf.com/linux/8061.html

Qemu kgdb调试内核:http://www.linuxdiyf.com/linux/5294.html

Linux下用gdb单步调试多进程方法:http://www.linuxdiyf.com/linux/7516.html

嵌入式Linux系统的GDB远程调试的实现:http://www.linuxdiyf.com/linux/651.html