多线程GDB调试

GDB常用命令描述

命令  命令描述

break 在代码里设置断点, 这将使程序执行到这里时被挂起

file 装入想要调试的可执行文件

kill 终止正在调试的程序

list 列出产生执行文件的源代码的一部分

make 使你在不退出  gdb时就可以重新产生可执行文件

next 执行一行源代码但不进入函数内部

print 显示表达式的值

quit 终止  gdb

run  执行当前被调试的程序

shell 使你能不离开  gdb 就执行  shell  命令

step 执行一行源代码而且进入函数内部

watch 监视一个变量的值而不管它何时被改变

 

GDB多线程调试

info threads 显示当前可调试的所有线程,每个线程会有一个GDB为其分配的ID,后面操作线程的时候会用到这个ID前面有*的是当前调试的线程。

thread ID 切换当前调试的线程为指定ID的线程。

breakthread_test.c:123 thread all 在所有线程中相应的行上设置断点

thread apply ID1ID2 command 让一个或者多个线程执行GDB命令command 

thread apply allcommand 让所有被调试线程执行GDB命令command

setscheduler-locking off|on|step 估计是实际使用过多线程调试的人都可以发现,在使用step或者continue命令调试当前被调试线程的时候,其他线程也是同时执行的,怎么只让被调试程序执行呢?通过这个命令就可以实现这个需求。off 不锁定任何线程,也就是所有线程都执行,这是默认值。 on 只有当前被调试程序会执行。 step 在单步的时候,除了next过一个函数的情况(熟悉情况的人可能知道,这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行。

 

gdb对于多线程程序的调试有如下的支持:

·        线程产生通知:在产生新的线程时, gdb会给出提示信息

(gdb) r
Starting program: /root/thread 
[New Thread 1073951360 (LWP 
12900)] 
[New Thread 1082342592 (LWP 12907)]---
以下三个为新产生的线程
[New Thread 1090731072 (LWP 12908)]
[New Thread 1099119552 (LWP 12909)]

·        查看线程:使用info threads可以查看运行的线程。

(gdb) info threads
  
Thread 1099119552(LWP 12940)   0xffffe002 in ?? ()
  
3 Thread1090731072 (LWP 12939)   0xffffe002 in ?? ()
  
2 Thread1082342592 (LWP 12938)   0xffffe002 in ?? ()
1 Thread1073951360 (LWP 12931)   main (argc=1, argv=0xbfffda04) atthread.c:21
(gdb)

注意,行首的蓝色文字为gdb分配的线程号,对线程进行切换时,使用该该号码,而不是上文标出的绿色数字。

另外,行首的红色星号标识了当前活动的线程

·        切换线程:使用 thread THREADNUMBER 进行切换,THREADNUMBER 为上文提到的线程号。下例显示将活动线程从 1 切换至 4

(gdb) info threads
   4 Thread 1099119552 (LWP 12940)   0xffffe002 in ?? ()
   3 Thread 1090731072 (LWP 12939)   0xffffe002 in ?? ()
   2 Thread 1082342592 (LWP 12938)   0xffffe002 in ?? ()
* 1 Thread 1073951360 (LWP 12931)   main (argc=1, argv=0xbfffda04) atthread.c:21
(gdb) 
thread 4
[Switching to thread 4 (Thread 1099119552 (LWP 12940))]#0  0xffffe002 in ?? ()
(gdb) info threads
* 4 Thread 1099119552 (LWP 12940)   0xffffe002 in ?? ()
   3 Thread 1090731072 (LWP 12939)   0xffffe002 in ?? ()
   2 Thread 1082342592 (LWP 12938)   0xffffe002 in ?? ()
   1 Thread 1073951360 (LWP 12931)   main (argc=1,argv=0xbfffda04) at thread.c:21
(gdb) 

后面就是直接在你的线程函数里面设置断点,然后continue到那个断点,一般情况下多线程的时候,由于是同时运行的,最好设置 set scheduler-locking on

这样的话,只调试当前线程 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值