gdb调试多线程的简单命令
来源:互联网 发布:希拉里失败原因 知乎 编辑:程序博客网 时间:2024/06/07 05:38
由于平时的编程当中经常会用到多线程,我想接触过多线程编程的人应该都会清楚多线程如果出了错,调起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调试多线程的简单命令
- gdb简单的调试命令
- GDB多线程调试的基本命令。
- GDB多线程调试的基本命令。
- 简单的gdb调试多线程(备忘)
- gdb调试的简单命令整理
- gdb简单调试命令的整理
- gdb调试命令---超简单的
- 几个简单的gdb调试命令
- GDB多线程调试基本命令
- GDB 多线程调试基本命令
- GDB 多线程调试基本命令
- gdb的多线程调试
- gdb调试 简单命令(备忘)
- gdb常用调试命令以及多线程堆栈的查看
- gdb的调试命令
- Linux下gdb调试的几个简单命令
- GDB对多线程的调试
- 各种排序算法实现及总结
- OPENCV错误
- android放大镜效果实现
- mfc消息机制
- cernet 2015年会征文
- gdb调试多线程的简单命令
- 算法简介,算法重要性
- 还是畅通工程(2006浙江大学研究生上机复试题目[最小生成树] hdoj 1233)
- 转载 android权限
- java中的移位运算符:<<,>>,>>>
- OC中NSMutableArray 和NSMutableDictionary 中打印乱码问题
- 用 mongodb + elasticsearch 实现中文检索
- 端到段、点到点通信的区别 优缺点
- Android UI设计——EditText控件