Linux(程序设计):04---GDB的多进程、多线程调试
原创
©著作权归作者所有:来自51CTO博客作者董哥的黑板报的原创作品,请联系作者获取转载授权,否则将追究法律责任
一、多进程的调试
follow-fork-mod
-
意义:代表当前gdb跟随着哪个进程在调试
-
注意:follow-fork-mod默认情况下跟随着主进程调试(parent)
- 查看当前gdb跟随着哪个进程在调试:
show follow-fork-mode
set follow-fork-mode parent //设置gdb跟随主进程调试(默认)
set follow-fork-mode child //设置gdb跟随着子进程调试
detach-on-fork
-
意义:当前gdb调试多进程的规则
-
查看gdb调试多进程时的规则:
- 如果结果显示on:代表调试一个进程,其他进程自动运行
- 如果结果显示off:代表调试一个进程,其他进程阻塞(处于等待状态)
show detach-on-fork
set detach-on-fork off
set detach-on-fork on //默认的
follow-fork-mod与detach-on-fork的组合
set follow-fork-mod parent
set detach-on-fork on
set follow-fork-mod child
set detach-on-fork on
- 同时调试两个进程,gdb跟随着父进程,子进程处于等待状态,在fork处
set follow-fork-mod parent
set detach-on-fork off
- 同时调试两个进程,gdb跟随着子进程,父进程处于等待状态,在fork处
set follow-fork-mod child
set detach-on-fork off
gdb调试口诀技巧
-
如果只想要调试父进程:在就父进程的代码处打上断点,然后follow-fork-mode 设为parent
-
如果只想要调试子进程:在就子进程的代码处打上断点,然后follow-fork-mode 设为child
- detach-on-fork根据自己的需求而定
其他命令
-
查看当前程序中正在调试的进程:
- GDB会为这些进程分配inferiorID号,但是这个ID号不是进程的PID
- 显示的信息中,每一个进程占用一行,如果有个ID前面带有“*”号,代表这个进程是gdb正在调试的进程
info inferiors
-
切换gdb调试的进程:
- ID号不是IPD,而是gdb内的info inferiors显示的ID
inferior 进程ID号
-
彻底删除一个进程:
- 如果该进程正在运行,不能删除。可以使用kill或者detach删除这个进程
remove-inferiors 进程inferiorID
- 让该进程detach掉,但是该进程还存在,还可以使用r来执行它:
kill inferiors 进程inferiorID
detach inferiors 进程inferiorID
attach与detach的使用
-
当我们进入gdb对一个进程调试的时候:
- 如果想要挂接别的进程来调试,就:attach PID
- 如果想要取消这个挂接的进程,就:detach PID
-
未进入gdb:如果想要对一个程序指定的进程调试,直接输入:gdb attach PID
二、多线程调试
查看当前程序中所有的线程
info threads
切换到不同的线程进行调试
thread 线程ID
线程锁定模式
show scheduler-locking
-
设置线程调试模式:
- on:锁定。调试一个线程时,其它线程锁定不能运行
- off:不锁定。调试一个线程时,其它线程不锁定自动运行(默认值)
- step:在step单步时,只有被调线程运行。防止其他线程在您单步执行时抢占当前线程
set scheduler-locking off
set scheduler-locking on
set scheduler-locking step
其他命令
set non-stop on/off
- 指定哪些线程执行后面的命令(command为GDB的命令)
thread apply ID1,ID2,ID3.... command
thread apply all command
thread apply all bt