10

一个奇怪的问题:

如果当前进程的堆栈已满,那么众所周知的“由于 StackOverflowException 而终止进程”屏幕是如何出现的?是运行时为其优雅降级保存了一些寄存器,还是可能运行另一个显示此屏幕的临时进程的内部技巧?

PS 知道这个问题的可能答案可以帮助某人从类似的严重故障情况中建立自己的“优雅降级(假设显示此类消息的功能非常有限)”机制。

在此处输入图像描述

4

1 回答 1

11

此消息由 CLR 显示。可以在 SSCLI20 发行版中看到代码,clr/src/vm/eepolicy.cpp 源代码文件:

void DisplayStackOverflowException()
{
    PrintToStdErrA("\n");

    PrintToStdErrA("Process is terminated due to StackOverflowException.\n");
}

依次由 EEPolicy::HandleFatalStackOverflow() 方法调用。您完全可以看到它的唯一原因是因为您正在运行控制台模式应用程序,因此到 stderr 的输出最终会出现在控制台窗口上。只有当 Windows 错误报告 (WER) 本身没有终止应用程序时,您才会看到它。

无法拦截此异常,CLR 无法继续运行托管代码,因为剩余的堆栈空间太少,无法安全运行任何托管代码。DisplayStackOverflowException() 调用后的代码行是:

    TerminateProcess(GetCurrentProcess(), COR_E_STACKOVERFLOW);
于 2013-01-29T20:24:53.003 回答