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

来源:互联网 发布:linux cp 排除文件夹 编辑:程序博客网 时间:2024/04/30 09:50

一、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会帮你检查一下条件是否满足。