一、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