GDB 多线程调试基本命令和一个实例问题的解决(转贴)
2012-08-09 20:40
555 查看
GDB 多线程调试基本命令和一个实例问题的解决(转贴)
分类: linux 使用2011-03-1814:16 335人阅读 评论(0) 收藏 举报
先介绍一下GDB多线程调试的基本命令。
info threads
显示当前可调试的所有线程,每个线程会有一个GDB为其分配的ID,后面操作线程的时候会用到这个ID。
前面有*的是当前调试的线程。
thread ID
切换当前调试的线程为指定ID的线程。
break thread_test.c:123 thread all
在所有线程中相应的行上设置断点
thread apply ID1 ID2 command
让一个或者多个线程执行GDB命令command。
thread apply all command
让所有被调试线程执行GDB命令command。
set scheduler-locking off|on|step
估计是实际使用过多线程调试的人都可以发现,在使用step或者continue命令调试当前被调试线程的时候,其他线程也是同时执行的,怎么只让被调试程序执行呢?通过这个命令就可以实现这个需求。
off 不锁定任何线程,也就是所有线程都执行,这是默认值。
on 只有当前被调试程序会执行。
step 在单步的时候,除了next过一个函数的情况(熟悉情况的人可能知道,这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行。
最后介绍一下我最近遇见的一个多线程调试和解决。
多线程如果dump,多为段错误,一般都涉及内存非法读写。
可以这样处理,使用下面的命令打开系统开关,让其可以在死掉的时候生成core文件。
ulimit -c unlimited
这样的话死掉的时候就可以在当前目录看到core.pid(pid为进程号)的文件。接着使用gdb:
gdb ./bin ./core.pid
进去后,使用bt查看死掉时栈的情况,在使用frame命令。
frame /f
n是一个从0开始的整数,是栈中的层编号。比如:frame 0,表示栈顶,frame 1,表示栈的第二层。
实际上这是一个堆栈帧,记录了当前程序函数调用的层次
还有就是里面某个线程停住,也没死,这种情况一般就是死锁或者涉及消息接受的超时问题(听人说的,没有遇到过)。遇到这种情况,可以使用:
gcore pid (调试进程的pid号)
手动生成core文件,在使用pstack(linux下好像不好使)查看堆栈的情况。如果都看不出来,就仔细查看代码,看看是不是在if,return,break,continue这种语句操作是忘记解锁,还有嵌套锁的问题,都需要分析清楚了。
相关文章推荐
- GDB多线程调试基本命令和实现简介以及一个常见问题的解决
- GDB多线程调试基本命令和实现简介以及一个常见问题的解决
- GDB 多线程调试基本命令 实现简介
- GDB 多线程调试基本命令
- GDB多线程调试的基本命令。
- GDB多线程调试的基本命令。
- GDB多线程调试基本命令
- 多线程之问题的解决及使用GDB调试多线程多进程的手段(九)
- GDB 多线程调试基本命令
- 一个很有深度的C++内存问题---GDB调试(一)
- Java--servlet + ThreadLocal解决多线程并发问题及实例
- gdb调试多进程和多线程命令
- 使用GDB调试多线程实例详解
- 这是我学习COM遇到的几个基本问题其解决 黄森堂(vcmfc)著 1.我用ATL生成一个组件对象,我在COM中使用IDD_IEncrypt,这个在哪里写义,是啥?GUID? 答:IDD_IEncry
- GDB调试基本命令(一)
- 真机调试遇到的一个证书问题以及解决办法
- gdb调试多进程和多线程命令
- (OK) 调试cBPM—CentOS7—gdb—gdbserver—问题的解决—1—手机死机
- CMD网络命令解决PC上网问题实例
- GDB 调试基本命令