目录
- 选择调试进程
- 进程切换
- 实例
- 多线程调试
选择调试进程
在GDB中有两个选项来确定调试的进程:
follow-fork-mode
,设置调试哪个进程detach-on-fork
,GDB在fork之后是否断开(detach)某个进程的调试
这两个选项的参数组合起来的效果如下表
follow-fork-mode | detach-on-fork | 效果 |
---|---|---|
parent | on | 只调试父进程 |
child | on | 只调试子进程 |
parent | off | 同时调试两个进程,子进程暂停 |
child | off | 同时调试两个进程,子进程暂停 |
进程切换
info inferiors
,查看当前所有进程inferiors <num>
,切换当前GDB调试进程,其中num
为上一条指令中列出的进程Num
实例
1 | int main(void) |
首先展示如何选择跟踪父子进程,如图
若同时调试两个进程,并且切换进程的效果如下
多线程调试
在另一篇博客《GDB调试之基本指令介绍》中第6章提到了在线程中打断点,这里再介绍下
当你的程序是多线程时,你可以定义你的断点是否在所有的线程上,或是在某个特定的线程。
break line thread threadNo
其中line
为你的源码行数,threadNo为info threads
命令中GDB给出的线程ID,若不指定threadNo
,则为所有线程打断点。
在多线程调试时,可以设置其余线程的阻塞状态
show scheduler-locking
,查看设置set scheduler-locking <on><off><step>
on
,表示调试线程执行时,其余线程锁定,阻塞等待,off
,表示不锁定其他线程step
,表示在step(单步)调试时,只有当前线程运行
这样就可以避免next调试时总是跳转到其他线程啦
线程和进程一样,同样支持切换
info thread
, 列出当前所有线程thread <num>
,切换线程,num为上一条指令给出的