Dot-Net

眾所周知的“由於 StackOverflowException 而終止程序”螢幕是如何出現的?

  • March 2, 2020

一個奇怪的問題:

如果目前程序的堆棧已滿,那麼眾所周知的“由於 StackOverflowException 而終止程序”螢幕是如何出現的?是執行時為其優雅降級保存了一些寄存器,還是可能執行另一個顯示此螢幕的臨時程序的內部技巧?

PS 知道這個問題的可能答案可以幫助某人從類似的嚴重故障情況中建立自己的“優雅降級(假設顯示此類消息的功能非常有限)”機制。

在此處輸入圖像描述

此消息由 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);

引用自:https://stackoverflow.com/questions/14590174