c# – 实时调试堆栈溢出

我有一个托管代码 Windows服务应用程序,由于托管StackOverFlowException,它偶尔会在生产中崩溃.我知道这是因为我在崩溃模式下运行了adplus并使用SoS分析了故障转储.我甚至连接了windbg调试器并将其设置为“go unhandled exception”.

我的问题是,我看不到任何托管堆栈或切换到任何线程.在调试器中断时,它们都被拆除了.

我不是Windbg专家,而且,除了在实时系统上安装Visual Studio或使用该工具进行远程调试和调试外,是否有人建议如何从违规线程中获取堆栈跟踪?

这就是我正在做的事情.

!threads

XXXX 11 27c 000000001b2175f0 b220 disabled 00000000072c9058:00000000072cad80 0000000019bdd3f0 0 Ukn System.StackOverflowException (0000000000c010d0)

此时你会看到XXXX ID表明线程已经死了.

解决方法

一旦你遇到堆栈溢出,你就很难调试问题 – 吹掉你的堆栈空间会使你的程序处于非确定状态,所以你不能依赖于它的任何信息.这一点 – 您尝试获取的任何堆栈跟踪可能已损坏,并且可能很容易将您指向错误的方向.即,一旦发生StackOverflowException,就太晚了.

此外,根据the documentation,您无法从.Net 2.0开始捕获StackOverflowException,因此使用try / catch包围您的代码的其他建议可能不起作用.考虑到堆栈溢出的副作用,这是非常有意义的(我很惊讶.Net曾经让你抓住它).

您唯一真正的选择是参与分析代码的繁琐工作,寻找可能导致堆栈溢出的任何内容,并添加某种标记,以便您可以在它们发生之前了解它们发生的位置.例如,显然任何递归方法都是第一个开始的方法,所以给它们一个深度计数器,如果它们达到你定义的某个“不合理”值,就抛出你自己的异常,这样你就可以实际获得有效的堆栈跟踪.

相关文章

原文地址:http://msdn.microsoft.com/en-us/magazine/cc163...
前言 随着近些年微服务的流行,有越来越多的开发者和团队所采...
最近因为比较忙,好久没有写博客了,这篇主要给大家分享一下...
在多核CPU在今天和不久的将来,计算机将拥有更多的内核,Mic...
c语言输入成绩怎么判断等级
字符型数据在内存中的存储形式是什么