7

次のコードを Windows 7 32 ビットで実行すると、ハード フェイルが発生します。

void CTestView::OnDraw(CDC* /*pDC*/)
{
    *(int*)0 = 0; // Crash

    CTestDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;

    // TODO: add draw code for native data here
}

ただし、これを Windows 7 64 ビットで試すと、出力ウィンドウに次のように表示されます。

Test.exe の 0x13929384 での初回例外: 0xC0000005: アクセス違反の書き込み場所 0x00000000。
Test.exe の 0x77c6ee42 での初回例外: 0xC0150010: 非アクティブ化されているアクティブ化コンテキストは、現在の実行スレッドに対してアクティブではありません。

これの理由は何ですか?ハードウェアの例外 ( http://msdn.microsoft.com/en-us/library/aa363082.aspx ) であることはわかっていますが、32 ビットと 64 ビットで実行したときの違いはなぜですか? この種のエラーを正しく処理するにはどうすればよいでしょうか? Windows がアプリケーションにメッセージを送り続けて実行するという現在の状況とは対照的に、それらは実際にトラップして修正する必要があるためです (したがって、ユーザーと開発者は問題が実際に発生したことにまったく気づきません)。

更新: 通常のクラッシュ レポート ソフトウェアは使用しますSetUnhandledExceptionFilterが、WndProc 内のハードウェア例外に対して x64 で呼び出されません。誰かがこれに関する情報、または回避策を持っていますか?

Update2: Microsoft Connect で問題を報告しました:
https://connect.microsoft.com/VisualStudio/feedback/details/550944/hardware-exceptions-on-x64-machines-are-silently-caught-in-wndproc-メッセージ

4

5 に答える 5

3

アクセス違反例外のためにスタックがアンワインドされている間に発生する別の例外があります。飲み込まれ、AVが消えます。どのコードがこれを行っているかを調べる必要があります。Debug + Exceptions で、Win32 Exceptions の Thrown ボックスをオンにします。デバッガーは最初のもので停止します。続行します。再び停止したときにコール スタックを確認します。わからない場合は質問に追加してください。

于 2010-04-13T17:22:34.160 に答える
1

OK、Microsoft から返信を受け取りました。

こんにちは、

ご報告ありがとうございます。これは Windows の問題であり、利用可能なホット フィックスがあることがわかりました。 必要に応じてインストールできる修正プログラムについては、 http://support.microsoft.com/kb/976038を参照 してください。

@Skute: プログラム互換性アシスタントは、プログラムの実行の継続を許可するかどうかを 1 回尋ね、その後は常に許可されるため、混乱を招く動作の原因になる可能性があることに注意してください。

Pat Brenner Visual C++ ライブラリ開発

したがって、回避策は、修正プログラムがインストールされていることを確認するか、アプリケーション内の各 WndProc を __try / __except ブロックでラップすることです。

于 2010-07-14T08:16:05.117 に答える
0

この問題を回避する唯一の方法は、アプリケーション内の各 WndProc コールバックを __try / __except で囲むことです。次に、例外を例外ハンドラーにルーティングします。恐ろしいですが、Windows自体の問題のようです。Microsoft からの連絡をまだ待っています。

于 2010-07-10T20:44:01.897 に答える
0

この問題は、実際には SEH が x64 でどのように機能するかに関連していると思います。スタックの巻き戻し中に例外がカーネルモードを介して戻る必要がある場合、スタックしているのは設計上の動作です: OnLoad 例外が消える場合。Windows は、例外を "処理" しています。ホット フィックスは、x86 と同じように特定の x64 アプリをクラッシュさせるための回避策です。

于 2010-12-09T15:44:18.493 に答える