c# – 实时调试堆栈溢出

前端之家收集整理的这篇文章主要介绍了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曾经让你抓住它).

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

原文链接:https://www.f2er.com/csharp/243925.html

猜你在找的C#相关文章