最近、Windows の例外処理に関する以下の記事を読みました。
二重スタック フォールトなどの特定の未処理の例外では、オペレーティング システムは、未処理の例外フィルターまたは JIT デバッガーを呼び出さずに、アプリケーションを直ちに終了します。
二重スタック障害とは何ですか? 通常のスタック フォールトとの違いは何ですか?
このフレーズは、おそらくこのCodeproject の記事から来たものです。そのサイトは、テクニカル レビューではあまり知られていません。「二重障害」の真の意味は、オペレーティング システム カーネルに関連しています。ユーザー モードの障害に応答するカーネルの障害ハンドラー自体が障害を被ると、二重障害が発生します。これは致命的であり、カーネル パニックを引き起こします。Windows でのブルー スクリーン。また、プロセッサに存在するものである x86 コアは、「トリプル フォールト」が発生するとコードの実行を停止します。
ここで悪いことは何もありません。彼が彼の記事で説明しようとしていたのは、スタック オーバーフローが原因でプログラムが爆発し、UnhandledExceptionFilter() に登録されたコードなど、クラッシュに応答して実行されるコードがスタックの最後のビットを消費する状態です。その Windows は、SO からの回復を試みるスレッドを提供します。8192 バイト (2 ページ) で、7080 バイト未満しか使用できません。そのようなコードがその予約を消費すると、ショーは終了し、それ以上関数呼び出しを行うことはできません。カーネルはアクセス違反を発生させ、プロセスを無条件に終了させます。
その小さな予約は、マネージド コードが SO に耐えられない理由でもあります。CLR は例外を反映するために必要なスタック領域が多すぎるため、試行せずにプログラムをすぐに終了します。基になるメカニズムであるガード ページに関する一般的なバックグラウンド アーティクルはこちらです。