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