次のコードを 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-メッセージ