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 に答える