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