gdb调试多线程的简单命令

本文介绍了如何使用gdb调试多线程程序,包括设置断点、查看线程信息、切换线程和控制线程执行。通过`info threads`命令查看线程,`thread ID`切换线程,`set scheduler-locking`控制线程执行模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于平时的编程当中经常会用到多线程,我想接触过多线程编程的人应该都会清楚多线程如果出了错,调起bug来是有多么麻烦,应为你某个地方出错了,有可能并不是这里的问题而是线程执行到这就切换到其他线程,而出错的是其他线程,我以前使用的办法是给某个线程sleep然后让内核自己调度去执行其他线程。很明显这种方法当有很多线程是并不是很使用,所以我就翻书学了几条调试多线程的简单gdb命令

1.测试所用的代码

1void *thread1(void *arg)
2{
3   printf("New thread1\n");
4   return NULL;
5}

6void *thread2(void *arg)
7{
8   printf("New thread2:\n");
9   return NULL;
10}

11int main(void)
12{
13  int err;
14  pthread_t tid1,tid2,tid3;
15  16if(pthread_create(&tid1,NULL,thread1,NULL) < 0)
17  {
18      printf("线程1创建失败\n");
19      exit(1);
20  }

21  22if(pthread_create(&tid2,NULL,thread2,NULL) < 0)
23  {
24      printf("线程2创建失败\n");
25      exit(1);
26  }

27if(pthread_create(&tid3,NULL,thread2,NULL) < 0)
28  {
29      printf("线程3创建失败\n");
30      exit(1);
31  }

32  printf("Run main thread:");
33  sleep(2000);
34  return 0;
35}

2.调试命令

首先设置三个断点让4个线程运行到对应的位置都停止运行具体操作见下图

其中图中断点22,28,54,对应测试代码的3,8,32

1.info threads
功能:显示当前可调试的所有线程,并且gdb会为每个线程分配一个ID(不是线程ID),我们之后的操作可以根据这个ID来确定操作哪个线程具体操作见下图


如上图所示ID1,2,3分别是gdb给予每个线程的新ID,我们之后操作线程就用它,ID为2的线程前面的*表示当前调试的线程为此线程
2.thread ID
调试目标ID指定的线程

3.set scheduler-locking [off|on|step]
在调试多线程程序时,默认除了被调试的线程在执行外,其他线程也都在运行,我们可以通过命令来控制这一切:off表示不锁定任何线程on表示只有当前调试的线程会继续运行,step表示在但不执行时只有当前线程会运行

3.总结

在用gdb调试多线程时,首先我们可以用info threads命令来查看可调时的线程,并获取其ID,接着调用thread ID来切到我们想要调试的线程,最后通过set scheduler-locking [参数]
来控制我们希望的线程运行方式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值