日期:2014-05-16  浏览次数:20887 次

如何用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就晓得了三
------解决方案--------------------