首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

怎么用GDB调试某一线程死循环

2012-03-20 
如何用GDB调试某一线程死循环目前Code::Blocks的CC BRANCH遇到一个奇怪的问题:在解析linux内核时,这两种情

如何用GDB调试某一线程死循环
目前Code::Blocks的CC BRANCH遇到一个奇怪的问题:在解析linux内核时,这两种情况下不会死循环:
1. 输出Debug信息,使用--debug-log运行选项,不会死循环
2. 输出Debug信息,使用--debug-log和--debug-log-to-file选项,也不会死循环

但,如果单独运行CB,再打开linux的内核工程(工程非常大,2.35MB,3.5万个文件,解析完成后达到130多万tokens),会在内存占用800MB的时候,出现死循环。

由于主界面是可以响应的,而且还可以顺利的关闭linux内核工程,所以死循环一定是发生在负责解析的子线程中。
我的问题是:如何用GDB调试某一线程死循环呢?

我尝试了:attach到目标进程,bt显示调用栈,但调用栈显示中除了一个stl_tree.h相关信息外,其他都是问号。
我该如何定位到发生死循环的函数?

或者提供下解决类似问题的思路?尝试??
谢谢!!

找到了一些资料,关键词:“gdb endless loop”、“gdb infinite loop”
http://www.unknownroad.com/rtfm/gdbtut/gdbinfloop.html
http://www.network-theory.co.uk/docs/gccintro/gccintro_76.html
http://www.cnblogs.com/dubingsky/archive/2009/07/08/1519525.html

[解决办法]
看起来linux内核源文件也不是很大啊,才2.3M,呵呵。

不过token数量实在太多啦,呵呵。
这个问题很奇怪,我有空也去测试一下,我们的CC代码太复杂了,除了问题都不知道是哪里,这个有点郁闷。。。
[解决办法]
有深度。关注了!
[解决办法]

[解决办法]
C-C,set non-stop切换模式,在这个模式下continue只continue当前线程。然后对每个线程用thread命令切换当前线程+continue命令继续当前线程来找出来是哪个线程出的问题。
[解决办法]
不过貌似确实没有多好的方法了,gdb下一个个线程看
[解决办法]
老邓每次发的都很.....
[解决办法]

线程就够麻烦的了,还要用gdb调试,晕倒,口吐白沫,抽搐!
[解决办法]

[解决办法]
根本看不懂 .....
[解决办法]

探讨

Debian/Ubuntu系列,给装的一大堆用不着的东西,卸载时又是一大堆的依赖,不爽。
好像有洁癖了。

[解决办法]
基本不大用gdb,通常在程序中添加调试信息..
[解决办法]
info threads 查看有那些thread
然后使用thread命令切换到该线程,打印堆栈
[解决办法]

gdb)break file:line
设置断点。

[解决办法]
完全看不懂。。
[解决办法]
好东西,谢谢分享!!
[解决办法]
路过,路过,路过.
[解决办法]

[解决办法]
经常用gdb的菜鸟路过,O(∩_∩)O~
[解决办法]

[解决办法]
很值得学习、思考,顶起来!!
[解决办法]
学习下,楼主辛苦了
[解决办法]
学习下,楼主辛苦了
[解决办法]
给你说个简单的办法,top -H -p pid 来查看这个进程哪个线程CPU占用高,记线程号
在gdb下info threads ,列出所有线程号和对应gdb中的id,再f id切换过去,
再bt就晓得了三
------解决方案--------------------


探讨

引用:

info threads 查看有那些thread
然后使用thread命令切换到该线程,打印堆栈

问题是我要打印堆栈的时候,出来几个与STL相关的位置,其他都是问号。
无法获取足够有用的信息。

[解决办法]
编译时,打错字求
[解决办法]

[解决办法]
你的程序有调试信息吗
探讨

引用:

info threads 查看有那些thread
然后使用thread命令切换到该线程,打印堆栈

问题是我要打印堆栈的时候,出来几个与STL相关的位置,其他都是问号。
无法获取足够有用的信息。

[解决办法]
你们说啥呢
[解决办法]
这个问题比较复杂 , 要细细研究
[解决办法]
W的回答都是原创,因为满足3个条件:数字、字母、特殊符号,超男破解~
[解决办法]
每天坚持顶帖
[解决办法]
这个问题很有内涵!!
[解决办法]
好东西,谢谢分享!!
[解决办法]
Thank you!!!!!
[解决办法]
谢谢分享!
[解决办法]
关注下
[解决办法]
路过~~~有深度啊
[解决办法]

[解决办法]
不熟悉gdb,不知道gdb支不支持显示线程的运行时间,我指的是占用cpu的时间,如果可以的话,中断所有的线程,检查线程的执行时间,最长的就八九不离十是死循环的那个了,最后列出调用栈,看看死在哪个函数上了,基本上问题就解决了
[解决办法]

[解决办法]
很有帮助呀,谢谢
[解决办法]
很有帮助呀,谢谢~~~
[解决办法]
不错,谢谢分享!
[解决办法]
GDB太有用了,
只是有时候在 eclipse cdt下它在启动的时候就死翘翘了,,悲具。。。

不知老邓有遇到这种情况没有啊?

我经常遇到,导致不能调试。。
[解决办法]
关注一下 对这个想了解更多
[解决办法]
顶哦,不错不错
[解决办法]
看啊看
[解决办法]
还没弄熟,继续。。
[解决办法]
探讨

引用:

GDB太有用了,
只是有时候在 eclipse cdt下它在启动的时候就死翘翘了,,悲具。。。

不知老邓有遇到这种情况没有啊?

我经常遇到,导致不能调试。。

我在CB下使用GDB,很少遇到启动失败的情况。
-g是肯定加了的,不过,有时奇怪的是bt显示不出来正确的调用栈。
另,多谢版主推荐。

[解决办法]

[解决办法]
唉 不懂。
死循环时, 直接attach进程, 用where看 卡在哪个函数上也看不到呗?
------解决方案--------------------


codeblocks 这个东西现在linux下用~不过个人认为不如eclipse好用,我经常打开一个cb添加一个lib就无缘无故的死掉了~~且之前添加还不给保存~~~
[解决办法]
学习一下,死循环没办法
[解决办法]
学习一下!谢谢啦!!!
[解决办法]
ptrace?
[解决办法]
我是gdb的菜鸟,不过正如某人说过一样,添加调试信息也是好办法,简单又直观。还有top看进程占用应该也能分析。
[解决办法]
据我尝试,CodeBlock不能进入死循环,在循环外设断点,进入就死。
[解决办法]

探讨
codeblocks 这个东西现在linux下用~不过个人认为不如eclipse好用,我经常打开一个cb添加一个lib就无缘无故的死掉了~~且之前添加还不给保存~~~

[解决办法]
我是来打JY的-_-!!!
[解决办法]

[解决办法]
很难度,顶了
[解决办法]
顶起··········
[解决办法]
有多少朋友看内核的啊
[解决办法]
够专业
[解决办法]
用gdb调多线程不太可能,只能加打印信息或log.但你调死循环倒有点可能.可以把断点设在loop外面.
比如:
C/C++ code
while(1){if(exit)break;...}return;//断点设在这里,如果没激活就是死循环了.
[解决办法]
非常牛
[解决办法]
汗,调试到这地步
[解决办法]
1111111111111111111111111
[解决办法]
ertgeh56ut5rit67o78pyup;87p;oo
[解决办法]
对命令行下使用gdb了解不多。
平常用GUI前端用习惯了。
能否详细介绍一下?
[解决办法]
关注学习下
[解决办法]
关注学习下
[解决办法]
dksfjsfjsfjsfjsf

[解决办法]
这题其实适合初学者。

热点排行