微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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.jb51.cc/csharp/243925.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐