当前位置:  技术问答>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...

本帖最后由 Loaden 于 2010-10-14 09:53:40 编辑
目前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

|

gdb)break file:line
设置断点。

|
看起来linux内核源文件也不是很大啊,才2.3M,呵呵。

不过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用都没用过 哇哈哈

|
基本不大用gdb,通常在程序中添加调试信息..

|
用gdb调多线程不太可能,只能加打印信息或log.但你调死循环倒有点可能.可以把断点设在loop外面.
比如:

while(1)
{
if(exit)
break;
...
}

return;//断点设在这里,如果没激活就是死循环了.



|
不过貌似确实没有多好的方法了,gdb下一个个线程看

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

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

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

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

|

CB是什么系统?
PS,是不是gdb版本太老了?去http://www.gnu.org/software/gdb/下个最新的gdb版本。
另外,你是用gdbserver远程调试,还是直接在本地调试?

|
ptrace?

|
我是gdb的菜鸟,不过正如某人说过一样,添加调试信息也是好办法,简单又直观。还有top看进程占用应该也能分析。  

|
该回复于2010-10-26 13:29:01被版主删除

|
有深度。关注了!

|

|
老邓每次发的都很.....

|

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

|
该回复于2010-12-03 11:43:37被版主删除

|
根本看不懂 .....

|
完全看不懂。。

    
 
 

您可能感兴趣的文章:

  • GDB下怎样调试多线程程序?
  • gdb也能调多线程程序吗?
  • 多线程编程下关于gdb程序调试的一个疑问。
  • GDB如何调试子线程,急,在线等!
  • gdb多线程调试问题
  • 如何在gdb调试多线程?
  • GDB调试线程,退出时老是出现异常
  • ~如何GDB调试因pthread_cond_wait()阻塞的线程??~
  • linux下 多线程打印输出看不到,但gdb下就能看到输出,是什么原因呢?
  • gdb调试多线程程序时的问题, 为何不在断点处停下来?
  • 有谁熟悉gdb多线程调试?有个问题想请教
  • 如何使用linux下gdb来调试python程序
  • gdb调试时命令行参数如何输入?比如main(int argc,char **argv)中,我要把一个filename作为argv[1]传入给gdb调试
  • 请问gdb是不是只能调试gcc编译的程序,在unix下用其它编译器编译的程序是不是不一定能用gdb调试的?
  • linux gdb: 我在一台机器上编译的程序用GDB可以调试,把程序放到另外一台机器上调试,调试信息就没有了 这是什么原因呢?
  • GDB调试 GDB挂了。。。
  • gdb 如何调试带命令行参数的程序 如 gdb a.out arg1,arg2
  • linux下用gdb调试程序感觉非常不方便,不知道大家使用的什么工具进行调试的呀?
  • 关于GDB无法调试segmentaton fault的问题,调试就死机
  • GDB调试问题,多共享库调试
  • gdb 怎么调试socket程序
  • 程序调试工具 GDB
  • 写调试器(像gdb)的一般思路是什么
  • gdb调试时的文件格式问题
  • gdb调试的问题,求高手。
  • gdb如何进行调试?
  • gdb调试动态链接库
  • 关于gdb调试资料---详细的
  • 哪位兄弟知道?gdb如何调试动态连接库
  • 在linux下除了gdb外还有没其他好用的调试器?
  • 在windows下编译和调试远程GDB BVRDE
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • gdb中怎么写循环
  • Linux下的gdb如何跳出循环,如何解除断点
  • 有关gdb调试问题 如何实现让一个循环运行给定数目的次数(或条件满足停止)
  • gdb for循环无法打印
  • gdb调试,每次循环怎么运行到指定的断点处,而不是单步调试
  • 使用gcc gdb的大牛进来说说gdb的强大之处在哪。我刚学linux了,vim我确实体会到了其强大之处。而对gcc gdb,体会不到gdb这工具的强大之处。
  • 请教 make gdb-6.4 出现 make[4]: Entering directory `/tmp/gdb-6.4/gdb/doc'
  • gdb 使用问题请教
  • gdb的问题,请教,会者不难,快来拿分
  • 在rh9上无法使用gdb是怎么回事呢
  • gdb高手请指教
  • 请问,有人研究过gdb-insight源码吗?
  • gdb调试
  • Linux下gdb如何追踪进入子进程??急急7777777777777
  • 如何编译gdb
  • 怎样在windows中编译生成gdb
  • gdb升级的问题
  • 如何阅读GDB源代码?
  • 我的gdb为什么不能设置logging?
  • 使用GDB调试程序,如何正确的向程序传递参数.
  • 用gdb调试时如何将命令行参数传入?
  • 找高手:gdb脚本传递参数问题
  • 使用gdb 时, command not found , linux里不是应该有这个工具吗?
  • gdb的时候代码 next显示的代码乱了
  • gdb下用shell写环境变量的问题


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3