什么是“双倍堆栈故障”?

7

我最近读到了有关Windows异常处理的以下内容。

在某些未处理的异常情况下,例如双倍堆栈故障,操作系统将立即终止应用程序,而不调用未处理异常过滤器或JIT调试器。

双倍堆栈故障是什么?它与常规堆栈故障有何不同?

1个回答

7
这个短语可能来自于这篇Codeproject文章。该网站并不以技术评论著称。 "double fault" 的真正含义与操作系统内核有关,当内核的故障处理程序响应用户模式故障本身遭受故障时,会发生 double fault。这是致命的,并引发内核恐慌。在 Windows 上是蓝屏。处理器中也存在这种情况,当 x86 核心遭受“三重错误”时,它停止执行代码。
这里没有什么太糟糕的情况,他在文章中想要描述的是由于堆栈溢出而导致程序崩溃的情况,以及运行以响应崩溃的代码(例如注册到 UnhandledExceptionFilter())消耗了 Windows 给线程的最后一点堆栈,以尝试从 SO 中恢复。这不多,8192 个字节(两页),可用空间小于 7080 个字节。如果这样的代码消耗了储备,则表演结束,无法进行进一步的函数调用。内核会引发访问冲突并无条件终止进程。
这个小储备也是托管代码无法在 SO 中生存的原因,CLR 需要太多的堆栈空间来反映异常,因此立即终止程序而不进行尝试。有关底层机制“guard pages”的通用背景文章在这里

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接