以下代码在 Windows 7 32bit 下运行时会出现严重故障:
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
但不会在 x64 上调用 WndProc 内的硬件异常。有没有人有这方面的任何信息,或解决方法?
Update2:
我在 Microsoft Connect 上报告了这个问题:
https ://connect.microsoft.com/VisualStudio/feedback/details/550944/hardware-exceptions-on-x64-machines-are-silently-caught-in-wndproc-消息