Почему необработанные исключения, сгенерированные в обратных вызовах таймера win32, не рассматриваются отладчиком как необработанные исключения? - PullRequest
3 голосов
/ 18 января 2012

Я выследил действительно коварную ошибку на работе.Событие, которое, по-видимому, вызывает очень странное поведение, которое я отслеживал, похоже, является исключением, которое выдается при обработке обратного вызова таймера.Исключение НЕ обрабатывается никаким моим кодом, поэтому я ожидал бы, что отладчик будет уведомлен о необработанном исключении и предупредит меня хорошим неприятным всплывающим окном.Нет, вместо этого сообщение об исключении «первый шанс» прослеживается в отладчике, и все молча продолжается.

Я написал следующую программу, которая демонстрирует эту проблему:

#include "stdafx.h"
#include <Windows.h>

class FooExcept
{
};

VOID CALLBACK Timer(HWND hwnd,
    UINT uMsg,
    UINT_PTR idEvent,
    DWORD dwTime)
{
    printf("Here\n");
    throw FooExcept();
    printf("Also Here\n");
}


int _tmain(int argc, _TCHAR* argv[])
{
    SetTimer(0, 0, 1000, Timer);

    int bRet;
    HWND hWnd;
    MSG msg;
    // Standard Win32 message pump
    while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
    { 
        if (bRet == -1)
        {
            // handle the error and possibly exit
        }
        else
        {
            TranslateMessage(&msg); 
            DispatchMessage(&msg); 
        }
    }

    return 0;
}

вывод этой программы в окно вывода Visual Studio повторяется:

First-chance exception at 0x76dbb9bc in TimerTest.exe: Microsoft C++ exception: FooExcept at memory location 0x0034f743..

Конечно, мой проект НАМНОГО сложнее и выводит много информации TRACE в отладчик.Легко для исключения первого шанса потеряться в выводе.

ОДНАКО

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

Такое поведение кажется совместимым между XP / VS 2008 и Win7 / VS 2010.

1 Ответ

7 голосов
/ 24 января 2012

Это было исправлено до некоторой степени (см. Ниже) в Windows 7 SP1.

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

  • установить параметры процесса в реестре или
  • функция вызова SetProcessUserModeExceptionPolicy, экспортированная kernel32.dll

Я подтвердил в Обновлениях в Win7 и WS08R2 SP1.xls , что это исправление действительно включено в Windows 7 Service Pack 1, поэтому все, что вам нужно сделать, это включить его (если вам повезло Windows 7 SP1 уже установлена).

Что касается объяснения , почему это было сделано , мы можем просто догадаться о какой-то опрометчивой попытке предотвратить сбой устаревшего приложения во имя обратной совместимости .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...