一个程序,在特定的情况下会出现死循环,怎么才能在程序死循环的时候得到此时的调用栈?(这个程序是debug版的)
自己有源代码,代码量很大,调试运行的时候不一定能出现死循环的情况。求教。

解决方案 »

  1.   

    你可以试试dump一个文件  用WinDbg调试  重现错误现场
      

  2.   

    网上有minidump这个类  
      

  3.   

    前提还是 你要知道检测死循环发生了在dump文件 
      

  4.   

    你怎么判断出是死循环的?状态是什么?CPU占有率高吗?界面有响应吗?这些现象能缩小问题范围。即使真的是死循环,也不是没办法检查,通过VS启动程序,在你认为出问题的时候,直接点击VS的暂停运行按钮,可能VS会提示没有代码,没有关系,这说明中断的地方在API里面,此时从调用栈窗口查看你的代码运行到哪了,简单分析一下,剩下的事情就是单步跟踪。
      

  5.   

    如果是VC6,暂停调试,在Debug选项下面看Thread,一个一个线程看,看有没有出现while,或者是阻塞模式的函数的调用.
      

  6.   

    磨刀不误砍柴工,加log吧。如果你的bug很快能复现,可以用分治的办法(就是类似二分查找)来加log排除。
      

  7.   

    to 13#, 16#这个方法也可以,不过程序是独立运行的,因为一些不便的原因,不能在vs中。
      

  8.   

    今天下午CSDN升级,现在才有空上。
      

  9.   

    to 17#
    说实话第一次听说调试日志。程序的逻辑部分是单线程,应该不是多线程的问题。to 18#
    代码很多,log方法比较慢。
    程序dump到了一个文件,windbg分析到的结果不是很有效,看不出问题出在哪里,dump到其他文件再做分析。to all
    谢谢大家热心解答。
      

  10.   


    程序有显示每秒更新的tick,tick不动了,程序还在运行,所以是死循环。
      

  11.   

    本人看法,本人觉得调试方法要灵活多变:
    我主要用的方法是:
    1,断点调试法,通过设置断点找到具体出错的地方。
    2,用MessageBox();这个函数来调试,因为这个函数可以截住进程,有时我发现这个方法挺有效,能方便程序员找到程序出错的地方。
      

  12.   

    添加一个log类用来保存信息,所有有可能出错的地方都向log 写进去,当然对于楼主那么大的程序,似乎不好办,写log的好处就是可以在用户使用的时候自动记录错误,有必要可以用seh捕捉异常,并上传log,这要看你程序是怎么架构的
      

  13.   

    出现死循环的时候dump现场,然后用windbg分析,问题已经解决。
    再次感谢大家热心解答!