gpt4 book ai didi

c# - 实时调试堆栈溢出

转载 作者:太空狗 更新时间:2023-10-29 21:25:56 25 4
gpt4 key购买 nike

我有一个托管代码 Windows 服务应用程序,由于托管 StackOverFlowException,它在生产中偶尔会崩溃。我知道这一点是因为我在崩溃模式下运行 adplus 并使用 SoS 分析了崩溃转储事后分析。我什至附加了 windbg 调试器并将其设置为“未处理的异常”。

我的问题是,我看不到任何托管堆栈或切换到任何线程。当调试器崩溃时,它们都被拆除了。

我不是 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 允许您捕获它)。

您唯一真正的选择是参与单调乏味的代码分析,寻找任何可能导致堆栈溢出的东西,并放入某种标记以便您了解它们发生的位置之前 它们发生了。例如,显然任何递归方法都是第一个开始的地方,所以给它们一个深度计数器并抛出你自己的异常如果它们达到你定义的一些“不合理”的值,这样你实际上可以得到有效的堆栈跟踪。

关于c# - 实时调试堆栈溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/769619/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com