CGDB调试多线程程序

2022-04-18 16:16:03 星期一
GDB调试多线程程序
按T进入tty模式


GDB多进程多线程调试实战

GDB设置线程锁

set scheduler-locking 命令的语法格式如下:
(gdb) set scheduler-locking mode

其中,参数 mode 的值有 3 个,分别为 off、on 和 step,它们的含义分别是:
off:不锁定线程,任何线程都可以随时执行;
on:锁定线程,只有当前线程或指定线程可以运行;
step:当单步执行某一线程时,其它线程不会执行,同时保证在调试过程中当前线程不会发生改变。但如果该模式下执行 continue、until、finish 命令,则其它线程也会执行,并且如果某一线程执行过程遇到断点,则 GDB 调试器会将该线程作为当前线程。

调试多线程中的单线程

1、设置当前线程
thread 线程号
2、为特定线程设置断点
break 7 thread 3
3、设置线程锁
此命令可以帮我们将其它线程都“锁起来”,使后续执行的命令只对当前线程或者指定线程有效,而对其它线程无效。
(gdb) set scheduler-locking mode

其中,参数 mode 的值有 3 个,分别为 off、on 和 step,它们的含义分别是:
off:不锁定线程,任何线程都可以随时执行;
on:锁定线程,只有当前线程或指定线程可以运行;
step:当单步执行某一线程时,其它线程不会执行,同时保证在调试过程中当前线程不会发生改变。但如果该模式下执行 continue、until、finish 命令,则其它线程也会执行,并且如果某一线程执行过程遇到断点,则 GDB 调试器会将该线程作为当前线程。

GDB执行特定线程

如果想单独控制某一线程进行指定的操作,可以借助 thread apply id... command 命令实现:
(gdb) thread apply id... command

参数 id... 表示要控制的目标线程的编号,编号个数可以是多个。如果想控制所有线程,可以用 all 代替书写所有线程的编号;参数 command 表示要目标线程执行的操作,例如 next、continue 等。

note
如上所示,当我们调用 thread apply 2 next 命令对 2 号线程进行逐步调试时,3 号线程也会运行,这是为什么呢?这和 GDB 调试器的调试机制有关。

默认情况下,无论哪个线程暂停执行,其它线程都会随即暂停;反之,一旦某个线程启动(借助 next、step、continue 命令),其它线程也随即启动。GDB 调试默认的这种调试模式(称为全停止模式),一定程序上可以帮助我们更好地监控程序中各个线程的执行。
注意,当对某个线程进行单步调试时,其它线程也会随即执行和停止,但执行的往往不只是一行代码,可能是多行代码

修改程序中的变量

set var x = 1

调试死锁

1、查看程序进程号
ps -ef | grep test
2、进入gdb然后输入attach 进程号
attach 进程号
3、查看线程卡在哪个地方
thread apply all bt

如何查看所有线程的入口函数

thread apply all bt //该明令可以查看所有线程的入口函数线程编号等

posted @ 2022-04-18 16:17  上官鸿信の  阅读(152)  评论(0编辑  收藏  举报