多进程调试
-- pg_stat在子进程中生效:
set follow- fork- mode child 命令设置gdb在fork之后跟踪子进程。
set follow- fork- mode parent 设置跟踪父进程。
set detach- on- fork off # 让父子进程都在gdb的控制下
info inferiors # info 查看当前进程信息
follow-fork-mode detach-on-fork 说明 parent on 只调试主进程(GDB默认) child on 只调试子进程 parent off 同时调试两个进程,gdb 跟主进程, 子进程 block 在 fork 位置 child off 同时调试两个进程, gdb 跟子进程, 主进程 block 在 fork 位置
多线程调试
1 、info threads:
这条命令显示的是当前可调试的所有线程, GDB会给每一个线程都分配一个ID。前面有* 的线程是当前正在调试的线程。
2 、thread ID:
切换到当前调试的线程为指定为ID的线程。
3 、thread apply all command:
让所有被调试的线程都执行command命令
4 、thread apply ID1 ID2 … command:
这条命令是让线程编号是ID1,ID2…等等的线程都执行command命令
5 、set scheduler- locking off| on| step:
在使用step或continue 命令调试当前被调试线程的时候,其他线程也是同时执行的,如果我们只想要被调试的线程执行,而其他线程停止等待,那就要锁定要调试的线程,只让它运行。
off: 不锁定任何线程,所有线程都执行。
on: 只有当前被调试的线程会执行。
step: 阻止其他线程在当前线程单步调试的时候抢占当前线程。只有当next、continue 、util以及finish的时候,其他线程才会获得重新运行的。
6 、show scheduler- locking:
这条命令是为了查看当前锁定线程的模式。
7. i threads
实现线程间切换
9. - g - rdynamic
在生成调试信息的时候加入 - g - rdynamic选项,然后gdb启动调试程序时,直接run,就能找出错误信息所在的地方
一个小提示:在输入gdb xx时,进入gdb命令,这时会输出一些信息。如上所示,这些信息大多都是关于gdb的一些信息,可以不让他输出,