【发布时间】:2014-03-17 21:14:00
【问题描述】:
我知道 .NET 中的 StackOverflowExceptions 无法被捕获、取消其进程并且没有堆栈跟踪。这是官方记录的on MSDN。但是,我想知道行为背后的技术(或其他)原因是什么。所有 MSDN 都说:
在 .NET Framework 的早期版本中,您的应用程序可能会捕获 StackOverflowException 对象(例如,从 无限递归)。但是,目前不鼓励这种做法 因为需要大量额外的代码才能可靠地捕获 堆栈溢出异常并继续程序执行。
这个“重要的附加代码”是什么?这种行为还有其他记录在案的原因吗?即使我们无法捕获 SOE,为什么我们至少不能获得堆栈跟踪?我和几个同事只花了几个小时调试一个生产 StackOverflowException,而这需要几分钟的时间来跟踪堆栈跟踪,所以我想知道我的痛苦是否有充分的理由。
【问题讨论】:
-
"栈上没有更多可用空间了。快,把必要的额外数据放到栈上,让我们能够抛出异常,让它记录相关信息,并找到并调用适当的处理程序"
-
@jalf 这实际上是这个问题最容易克服的方面(RT 可以简单地设置一个接近实际堆栈大小的“软限制”,这样可以保证如果一个发生软溢出)。
-
@HansPassant 您应该认真考虑用该信息回答问题。很棒的东西。
-
只有我一个人担心在stackoverflow上询问堆栈溢出会导致宇宙崩溃吗?
-
相关 Java 问题:Why does this method print 4? 和 Understanding java stack - 显示从 StackOverflow 恢复时可能发生的情况 - 额外的方法调用会导致额外的堆栈溢出错误,而不是处于良好状态。当然,Java 不是 .Net,但我认为它很有趣。
标签: c# .net stack-overflow