(1)gdb ./program运行程序
(2)程序挂掉
(3)info thread查看程序挂掉瞬间所有运行线程执行到的位置:
此时,可以粗略看到哪些线程执行出现了问题(线程号前面带*的表示当前线程)。那么可以着重对这些线程进行分析。
(4)若要对某个线程进行分析,可以执行 " thread 线程号" 切换到某个线程,“bt” 查看这个线程的调用栈,“ frame ”切换到这个线程的某个栈帧。
(5)thread apply thread_id commandGDB调试特定线程
(6) (gdb) break location thread id
(gdb) break location thread id if...
GDB为特定线程设置断点
(7)(gdb) set scheduler-locking mode GDB设置线程锁
前面提到,使用 GDB 调试多线程程序时,默认的调试模式为:一个线程暂停运行,其它线程也随即暂停;一个线程启动运行,其它线程也随即启动。要知道,这种调试机制确实能帮我们更好地监控各个线程的“一举一动”,但并非适用于所有场景。
一些场景中,我们可能只想让某一特定线程运行,其它线程仍维持暂停状态。要想达到这样的效果,就需要借助 set scheduler-locking 命令。 此命令可以帮我们将其它线程都“锁起来”,使后续执行的命令只对当前线程或者指定线程有效,而对其它线程无效。
set scheduler-locking 命令的语法格式如下:
(gdb) set scheduler-locking mode
其中,参数 mode 的值有 3 个,分别为 off、on 和 step,它们的含义分别是:
- off:不锁定线程,任何线程都可以随时执行;
- on:锁定线程,只有当前线程或指定线程可以运行;
- step:当单步执行某一线程时,其它线程不会执行,同时保证在调试过程中当前线程不会发生改变。但如果该模式下执行 continue、until、finish 命令,则其它线程也会执行,并且如果某一线程执行过程遇到断点,则 GDB 调试器会将该线程作为当前线程。