0

我在 ntdll.dll 中得到一个带有执行代码 c00000fd (STATUS_STACK_OVERFLOW) 的 appcrash。

这是否意味着在我的托管代码之外的本机代码中某处存在堆栈溢出?因为对于托管代码,我们有System.StackOverflowException. 但是在我的情况下没有,也没有可以提供线索的堆栈跟踪。

4

1 回答 1

4

你再也抓不住System.StackOverflowException

从 .Net 2.0 开始,它们只能在以下情况下被捕获。

  • CLR 在托管环境中运行,其中主机专门允许处理 StackOverflow 异常
  • stackoverflow 异常是由用户代码引发的,而不是由于实际的堆栈溢出情况(参考)

虽然错误说它发生在ntdll.dll 中,但很可能是由您的代码引起的。

我的第一步是添加或打开生产中的最高调试日志记录,这样您就可以尝试缩小它发生的位置和情况。

其次,我将开始调试(附加调试器)并仔细检查该方法类,直到找到它。很可能是由于一些递归,这是我开始寻找的第一个地方。


其他资源和参考

C# 捕获堆栈溢出异常

如何在我的应用程序中找到 StackOverflowException 的来源

如何在不链接到源代码的情况下调试 System.StackOverflowException?

如何防止和/或处理 StackOverflowException?

如何在 .NET 中调试 stackoverflowexception

排除异常:System.StackOverflowException

StackOverflowException 类

在 .NET Framework 1.0 和 1.1 中,您可以捕获 StackOverflowException 对象(例如,从无限递归中恢复)。从 .NET Framework 2.0 开始,您无法使用 try/catch 块捕获 StackOverflowException 对象,并且默认情况下会终止相应的进程。因此,您应该编写代码来检测和防止堆栈溢出。例如,如果您的应用程序依赖于递归,请使用计数器或状态条件来终止递归循环。

于 2018-10-25T02:12:18.007 回答