当前位置: 技术问答>linux和unix
如何用GDB调试某一线程死循环
来源: 互联网 发布时间:2016-12-08
本文导语: 本帖最后由 Loaden 于 2010-10-14 09:53:40 编辑 目前Code::Blocks的CC BRANCH遇到一个奇怪的问题:在解析linux内核时,这两种情况下不会死循环: 1. 输出Debug信息,使用--debug-log运行选项,不会死循环 2. 输出Debug信息,使用--deb...
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
|
用
gdb)break file:line
设置断点。
gdb)break file:line
设置断点。
|
看起来linux内核源文件也不是很大啊,才2.3M,呵呵。
不过token数量实在太多啦,呵呵。
这个问题很奇怪,我有空也去测试一下,我们的CC代码太复杂了,除了问题都不知道是哪里,这个有点郁闷。。。
不过token数量实在太多啦,呵呵。
这个问题很奇怪,我有空也去测试一下,我们的CC代码太复杂了,除了问题都不知道是哪里,这个有点郁闷。。。
|
C-C,set non-stop切换模式,在这个模式下continue只continue当前线程。然后对每个线程用thread命令切换当前线程+continue命令继续当前线程来找出来是哪个线程出的问题。
|
给你说个简单的办法,top -H -p pid 来查看这个进程哪个线程CPU占用高,记线程号
在gdb下info threads ,列出所有线程号和对应gdb中的id,再f id切换过去,
再bt就晓得了三
在gdb下info threads ,列出所有线程号和对应gdb中的id,再f id切换过去,
再bt就晓得了三
|
很多需要的却没装 嘿嘿
不做开发 连gdb用都没用过 哇哈哈
|
基本不大用gdb,通常在程序中添加调试信息..
|
用gdb调多线程不太可能,只能加打印信息或log.但你调死循环倒有点可能.可以把断点设在loop外面.
比如:
比如:
while(1)
{
if(exit)
break;
...
}
return;//断点设在这里,如果没激活就是死循环了.
|
不过貌似确实没有多好的方法了,gdb下一个个线程看
|
info threads 查看有那些thread
然后使用thread命令切换到该线程,打印堆栈
然后使用thread命令切换到该线程,打印堆栈
|
GDB太有用了,
只是有时候在 eclipse cdt下它在启动的时候就死翘翘了,,悲具。。。
不知老邓有遇到这种情况没有啊?
我经常遇到,导致不能调试。。
只是有时候在 eclipse cdt下它在启动的时候就死翘翘了,,悲具。。。
不知老邓有遇到这种情况没有啊?
我经常遇到,导致不能调试。。
|
CB是什么系统?
PS,是不是gdb版本太老了?去http://www.gnu.org/software/gdb/下个最新的gdb版本。
另外,你是用gdbserver远程调试,还是直接在本地调试?
|
ptrace?
|
我是gdb的菜鸟,不过正如某人说过一样,添加调试信息也是好办法,简单又直观。还有top看进程占用应该也能分析。
|
|
有深度。关注了!
|
|
老邓每次发的都很.....
|
线程就够麻烦的了,还要用gdb调试,晕倒,口吐白沫,抽搐!
|
|
根本看不懂 .....
|
完全看不懂。。