Исключения, тихо пойманные Windows, как обработать вручную?

У нас есть проблемы с Windows, тихо съедая исключения и позволяя приложению продолжить работать, когда исключение выдается в насосе сообщения. Например, мы создали тест MDI-приложение MFC и переопределили OnDraw:

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
}

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

Исключение первого шанса в 0x13929384 в Test.exe: 0xC0000005: местоположение записи Нарушения прав доступа 0x00000000.
Исключение первого шанса в 0x77c6ee42 в Test.exe: 0xC0150010: деактивируемый контекст активации не активен для текущего потока выполнения.

Я знаю, почему я получаю исключение контекста приложения, но почему оно обрабатывает тихо? Это означает, что наши приложения могли переносить серьезные проблемы, когда используемый, но мы никогда не будем знать об этом, потому что наши пользователи никогда не будут сообщать ни о каких проблемах.

20
задан Johan 12 April 2010 в 13:10
поделиться

3 ответа

После просмотра похожих вопросов я наткнулся на следующий ответ: {{ 1}} OpenGL подавляет исключения в диалоговом приложении MFC

«Хорошо, я нашел дополнительную информацию об этом. В моем случае это Windows 7 , которая устанавливает {{ 1}} KiUserCallbackExceptionHandler в качестве обработчика исключений перед вызовом моего WndProc и предоставлением мне управления выполнением . Это делается с помощью ntdll! KiUserCallbackDispatcher. Я {{1 }} подозреваю, что это мера безопасности, принятая Microsoft для предотвращения взлома SEH.

Решение состоит в том, чтобы обернуть ваш wndproc (или hookproc) попыткой / except frame. "

Я отправил отчет об ошибке в Microsoft, вы можете увидеть их ответ здесь:
http://connect.microsoft.com/VisualStudio/feedback/details/550944 / аппаратные исключения-на-x64-машинах-тихо-пойман-в-wndproc-беспорядок возраст

От Microsoft:

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

11
ответ дан 30 November 2019 в 00:13
поделиться

Ваш вывод выглядит так, как будто вы используете Visual Studio...
Если нет, то забудьте о моем ответе.
Вы можете указать, какие исключения будут выбрасываться нормально, то есть Visual Studio перехватит их, и ваша программа остановится там, где произошло нарушение доступа. Сделать это можно в меню Debug/Exceptions.... Если вы не уверены в том, что именно нужно включить, просто включите их все...

-1
ответ дан 30 November 2019 в 00:13
поделиться

функции, которые могут быть интересны:

SetUnhandledExceptionFilter()
_set_invalid_parameter_handler()
_RTC_SetErrorFuncW()
_CrtSetReportHookW2()

PS, помните, что SetUnhandledExceptionFilter() может быть переопределена другими dll, загруженными в ваш . exe. Например, flash и nvidia direct3d делают это. Я использую api hooking для решения этой проблемы.

4
ответ дан 30 November 2019 в 00:13
поделиться
Другие вопросы по тегам:

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