gdb调试多进程
多进程时,进入调试状态后,默认调试主进程。
1. 查找fork出子进程的代码在第几行,然后打上断点。
2.运行至断点处,info feriors可查看当前调试的进程
3.设置follow-fork-mode 的值为child,表示只调试的子进程,再查看当前调试进程发现变成了新产生出来的进程,即子进程。follow-fork-mode(默认值是parent)和detach-on-fork(默认值是on)结合使用。4种组合的意义分别如下:
follow-fork-mode | detach-on-fork | 说明 |
---|---|---|
parent | on | 只调试父进程 |
child | on | 只调试子进程 |
parent | off | 同时调试两个进程,gdb跟主进程,子进程block在fork位置 |
child | off | 同时调试两个进程,gdb跟子进程,主进程block在fork位置 |
所以我们set follow-fork-mode child ,detach-on-fork没有设置,默认是on,即第二种使用场景,只调试子进程。
4.可以使用inferior+进程编号(即info inferiors后显示在第一列的号码)来切换当前正在调试的进程。
以上就是调试多进程用到的命令。
gdb调试多线程
1.在创建完线程的代码处打上断点,运行至断点处,info threads查看当前进程内的线程。可以看到,当前正在调试的是主线程。
2.和多进程类似,可以使用thread+线程编号切换当前正在调试的线程。
所以,thread 后*号到了编号为3的线程的前面,表示当前调试的就是该线程。
3.使用thread apply [编号…] [命令]可以让多个线程同时执行某条命令。
如:让2,3线程同时向下执行一步。也可以使用thread apply all [命令],让所有线程执行某个调试命令。
4.可以设置scheduler-locking参数(默认值为off),控制是多个线程同时运行还是只运行某个线程,它的取值和意义如下:
scheduler-locking | 意义 |
---|---|
on | 当前调试的线程单独运行 |
off | 所有线程一起执行 |
step | 没有发生函数调用时单独执行当前线程,有函数调用时所有线程一起执行 |
有关于多线程调试的常用命令大概就是这些。