一个好奇的问题:
如果当前进程的堆栈已满,如何出现众所周知的“进程因 StackOverflowException 而终止”屏幕?是运行时保存一些寄存器以使其正常降级,还是可能是一个内部技巧,可能会运行另一个临时进程来显示此屏幕?
附:知道这个问题的可能答案可以帮助某人从类似的严重故障情况中构建自己的“优雅降级(假设显示此类消息的功能非常有限)”机制。
该消息由 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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)