Следующий код приведет к серьезному сбою при работе в 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 64bit, я просто получу это в окне вывода:
Исключение первого шанса в 0x13929384
в Test.exe: 0xC0000005: доступ
нарушение письменного местоположения 0x00000000.
Исключение первого шанса в 0x77c6ee42
в Test.exe: 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