下面的代码会给时在Windows 7 32位运行硬故障:64位异常静默失败
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位,我刚刚得到这个在输出窗口:0000005:访问 冲突写入位置在00000000 0x13929384 在将Test.exe
第一次机会异常。
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-messages
我不认为只是为64位编译时的选项? – jalf 2010-04-14 10:49:16
为x64编译并不是一个真正的选择,我们的源代码包含大约100万行代码,并且有相当数量的汇编程序。将其与通过QA等运行两个单独构建的额外成本相结合。 – 2010-04-15 08:57:03
另请参见[WindowProc回调函数]的备注部分(http://msdn.microsoft.com/en-us/library/windows/desktop/ms633573% 28v = vs.85%29.aspx) – wimh 2014-01-20 13:08:53