码迷,mamicode.com
首页 > 数据库 > 详细

gdb调试多线程的简单命令

时间:2015-08-21 23:29:39      阅读:238      评论:0      收藏:0      [点我收藏+]

标签:多线程   bug   调试   gdb   线程   

由于平时的编程当中经常会用到多线程,我想接触过多线程编程的人应该都会清楚多线程如果出了错,调起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 [参数]
来控制我们希望的线程运行方式

版权声明:本文为博主原创文章,未经博主允许不得转载。

gdb调试多线程的简单命令

标签:多线程   bug   调试   gdb   线程   

原文地址:http://blog.csdn.net/shreck66/article/details/47842371

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!