我最近阅读了有关 Windows 异常处理的以下内容。
在某些未处理的异常中,例如双堆栈错误,操作系统将立即终止应用程序,而无需调用未处理的异常过滤器或 JIT 调试器。
什么是双栈故障?它与常规堆栈故障有何不同?
这句话可能来自这篇Codeproject 文章。该网站在技术审查方面并不出名。“双重故障”的真正含义与操作系统内核有关,当内核的故障处理程序响应用户模式故障本身出现故障时,您就会得到双重故障。这是致命的并引发内核恐慌。Windows 上的蓝屏。同样存在于处理器中的东西是,x86 内核在遇到“三重故障”时会停止执行代码。
这里没什么不好的,他在文章中的意思是,程序由于堆栈溢出而崩溃,并且响应崩溃而运行的代码(例如使用 UnhandledExceptionFilter() 注册的代码)消耗了堆栈的最后一位Windows 提供了一个线程来尝试从 SO 中恢复。这并不多,8192 字节(两页)可用不到 7080 字节。如果这样的代码消耗了该储备,那么表演就结束了,不能进行进一步的函数调用。内核引发访问冲突并无条件终止进程。
这个小保留也是托管代码无法在 SO 中生存的原因,CLR 需要太多堆栈空间来反映异常,因此无需尝试就立即终止程序。保护页面的通用背景文章,底层机制,在这里。