7

最近、Windows の例外処理に関する以下の記事を読みました。

二重スタック フォールトなどの特定の未処理の例外では、オペレーティング システムは、未処理の例外フィルターまたは JIT デバッガーを呼び出さずに、アプリケーションを直ちに終了します。

二重スタック障害とは何ですか? 通常のスタック フォールトとの違いは何ですか?

4

1 に答える 1

7

このフレーズは、おそらくこのCodeproject の記事から来たものです。そのサイトは、テクニカル レビューではあまり知られていません。「二重障害」の真の意味は、オペレーティング システム カーネルに関連しています。ユーザー モードの障害に応答するカーネルの障害ハンドラー自体が障害を被ると、二重障害が発生します。これは致命的であり、カーネル パニックを引き起こします。Windows でのブルー スクリーン。また、プロセッサに存在するものである x86 コアは、「トリプル フォールト」が発生するとコードの実行を停止します。

ここで悪いことは何もありません彼が彼の記事で説明しようとしていたのは、スタック オーバーフローが原因でプログラムが爆発し、UnhandledExceptionFilter() に登録されたコードなど、クラッシュに応答して実行されるコードがスタックの最後のビットを消費する状態です。その Windows は、SO からの回復を試みるスレッドを提供します。8192 バイト (2 ページ) で、7080 バイト未満しか使用できません。そのようなコードがその予約を消費すると、ショーは終了し、それ以上関数呼び出しを行うことはできません。カーネルはアクセス違反を発生させ、プロセスを無条件に終了させます。

その小さな予約は、マネージド コードが SO に耐えられない理由でもあります。CLR は例外を反映するために必要なスタック領域が多すぎるため、試行せずにプログラムをすぐに終了します。基になるメカニズムであるガード ページに関する一般的なバックグラウンド アーティクルはこちらです。

于 2012-08-09T17:09:56.693 に答える