下面的代碼會給時在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