Исключения на 64 бита в WndProc тихо перестали работать

Следующий код даст трудный сбой, когда выполнено в соответствии с 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-сообщения

7
задан Mark Ingram 14 April 2010 в 15:36
поделиться

3 ответа

Хорошо, я получил ответ от Microsoft:

Здравствуйте,

Спасибо за отчет. Я узнал что это проблема Windows, и доступно горячее исправление. Пожалуйста видеть http://support.microsoft.com/kb/976038 для исправления, которое вы можете установить, если вы желание.

@Skute: обратите внимание, что Программа Помощник по совместимости спросит один раз если программе должно быть разрешено продолжить выполнение, и после этого он всегда будет разрешено, так что это может быть причина сбивающего с толку поведения вы видите.

Библиотеки Visual C ++ Пэта Бреннера Разработка

Таким образом, обходной путь - либо убедиться, что исправление установлено, либо обернуть каждый WndProc в вашем приложении блоком __try / __except.

1
ответ дан 7 December 2019 в 14:30
поделиться

Во время раскрутки стека возникает еще одно исключение для исключения нарушения прав доступа. Которая проглатывается, вызывая исчезновение АВ. Вам нужно будет узнать, какой код это делает. Отладка + исключения, установите флажок Выброшено для исключений Win32. Отладчик остановится на первом, продолжайте. Проверьте стек вызовов, когда он снова остановится. Добавьте это к своему вопросу, если не можете понять.

3
ответ дан 7 December 2019 в 14:30
поделиться

Единственный способ, с помощью которого нам удалось обойти эту проблему, - это поставить __try / __except вокруг каждого обратного вызова WndProc в приложении. Затем мы направляем исключение в наш обработчик исключений. Ужасно, но похоже, что это проблема самой Windows. Все еще ждем ответа от Microsoft.

0
ответ дан 7 December 2019 в 14:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: