我在 ntdll.dll 中得到一个带有执行代码 c00000fd (STATUS_STACK_OVERFLOW) 的 appcrash。
这是否意味着在我的托管代码之外的本机代码中某处存在堆栈溢出?因为对于托管代码,我们有System.StackOverflowException
. 但是在我的情况下没有,也没有可以提供线索的堆栈跟踪。
我在 ntdll.dll 中得到一个带有执行代码 c00000fd (STATUS_STACK_OVERFLOW) 的 appcrash。
这是否意味着在我的托管代码之外的本机代码中某处存在堆栈溢出?因为对于托管代码,我们有System.StackOverflowException
. 但是在我的情况下没有,也没有可以提供线索的堆栈跟踪。
你再也抓不住System.StackOverflowException
了
从 .Net 2.0 开始,它们只能在以下情况下被捕获。
- CLR 在托管环境中运行,其中主机专门允许处理 StackOverflow 异常
- stackoverflow 异常是由用户代码引发的,而不是由于实际的堆栈溢出情况(参考)
虽然错误说它发生在ntdll.dll 中,但很可能是由您的代码引起的。
我的第一步是添加或打开生产中的最高调试日志记录,这样您就可以尝试缩小它发生的位置和情况。
其次,我将开始调试(附加调试器)并仔细检查该方法类,直到找到它。很可能是由于一些递归,这是我开始寻找的第一个地方。
其他资源和参考
如何在我的应用程序中找到 StackOverflowException 的来源
如何在不链接到源代码的情况下调试 System.StackOverflowException?
如何防止和/或处理 StackOverflowException?
如何在 .NET 中调试 stackoverflowexception
排除异常:System.StackOverflowException
在 .NET Framework 1.0 和 1.1 中,您可以捕获 StackOverflowException 对象(例如,从无限递归中恢复)。从 .NET Framework 2.0 开始,您无法使用 try/catch 块捕获 StackOverflowException 对象,并且默认情况下会终止相应的进程。因此,您应该编写代码来检测和防止堆栈溢出。例如,如果您的应用程序依赖于递归,请使用计数器或状态条件来终止递归循环。