Как появляется общеизвестный экран "Процесс завершен из-за исключения StackruException"
Любопытный вопрос:
Как появляется широко известный экран "Процесс завершен из-за исключения StackruException", если стек для текущего процесса заполнен? Сохраняется ли во время выполнения некоторые регистры для постепенного ухудшения или это внутренняя хитрость, которая может запустить другой временный процесс, отображающий этот экран?
PS Знание возможного ответа на этот вопрос может помочь кому-то создать свой собственный механизм "постепенного ухудшения (при условии очень ограниченной функциональности показа такого сообщения)" из аналогичных критических ситуаций отказа.
1 ответ
Это сообщение отображается CLR. Вы можете увидеть код в дистрибутиве SSCLI20, файл исходного кода clr/src/vm/eepolicy.cpp:
void DisplayStackruException()
{
PrintToStdErrA("\n");
PrintToStdErrA("Process is terminated due to StackruException.\n");
}
Который в свою очередь вызывается методом EEPolicy::HandleFatalStackru(). Единственная причина, по которой вы можете увидеть его, заключается в том, что вы запускаете приложение в режиме консоли, поэтому вывод в stderr заканчивается в окне консоли. И вы увидите это только в том случае, если Windows Error Reporting (WER) сама не прервала приложение.
Нет возможности перехватить это исключение, CLR не может продолжить выполнение управляемого кода, так как осталось слишком мало стекового пространства для безопасного выполнения любого управляемого кода. Строка кода после вызова DisplayStackruException():
TerminateProcess(GetCurrentProcess(), COR_E_STACKOVERFLOW);