我有一个托管代码 Windows 服务应用程序,由于托管 StackOverFlowException,该应用程序在生产中偶尔会崩溃。我知道这一点是因为我在崩溃模式下运行了 adplus 并使用 SoS 事后分析了崩溃转储。我什至附加了 Windbg 调试器并将其设置为“转到未处理的异常”。
我的问题是,我看不到任何托管堆栈或切换到任何线程。当调试器崩溃时,它们都被拆除了。
我不是 Windbg 专家,并且缺乏在实时系统上安装 Visual Studio 或使用远程调试和使用该工具进行调试的功能,有没有人对我如何从有问题的线程中获取堆栈跟踪有任何建议?
这就是我正在做的事情。
!threads
...
XXXX 11 27c 000000001b2175f0 b220 禁用 00000000072c9058:00000000072cad80 0000000019bdd3f0 0 Ukn System.StackOverflowException (0000000000c010d0)
...
此时您会看到 XXXX ID,表明该线程已经死亡。
一旦遇到堆栈溢出,您就很难调试该问题 - 耗尽堆栈空间会使您的程序处于不确定状态,因此您不能依赖any此时其中的信息 - 您尝试获取的任何堆栈跟踪都可能已损坏,并且很容易将您引向错误的方向。即,一旦发生StackOverflowException,就为时已晚了。
另外,根据文档 http://msdn.microsoft.com/en-us/library/system.stackoverflowexception.aspx从 .Net 2.0 开始,您无法捕获 StackOverflowException,因此用 try/catch 包围您的代码的其他建议可能行不通。考虑到堆栈溢出的副作用(我很惊讶 .Net 竟然允许你捕获它),这是完全有道理的。
您唯一真正的选择是进行单调乏味的代码分析,查找任何可能导致堆栈溢出的内容,并放入某种标记,以便您可以了解它们发生的位置before它们发生了。例如,显然任何递归方法都是第一个开始的地方,所以给它们一个深度计数器并抛出你自己的异常如果它们达到您定义的某个“不合理”值,那么您实际上可以获得有效的堆栈跟踪。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)