В Microsoft Windows API вы можете использовать SetUnhandledExceptionFilter, установить обработчик для необработанных исключений. Большой улов, упомянутый на этой странице:
Если происходит исключение в процессе, который не отлаживается, а также
исключение попадает в фильтр необработанных исключений, этот фильтр
вызовет функцию фильтра исключений, указанную
Параметр lpTopLevelExceptionFilter.
(акцент добавлен)
Что в основном означает, что если процесс отлаживается, отладчик получает исключение, и мой фильтр пропускается!
Я могу проверить & отладить мой ExceptionFilter старомодным способом, с printfs и trial-n-error.
Но я что-то упустил? Есть ли хороший способ интерактивной отладки ExceptionFilter, если он отключен в отладчике?
Оформить заказ Раздел разрешения KB173652 который говорит о размещении всего кода в main / WinMain в _пытаться/_except блок, как показано ниже.
void main (int argc, char **argv)
{
__try
{
// all of code normally inside of main or WinMain here...
}
__except (MyUnFilter (GetExceptionInformation()))
{
OutputDebugString ("executed filter function\n");
}
}
Еще одна статья, Отладка пользовательских фильтров для необработанных исключений, описывает еще пару приемов в дополнение к описанному выше. Я лично использую тот, где вы отображаете окно сообщения внутри фильтра исключений, а затем присоединяете отладчик. я использую IsDebuggerPresent определить, отображать ли окно сообщения или нет.
Я знаю, что этот пост был уже давно, но я случайно наткнулся на него, ища что-то еще. Я рад сказать, что то, что спрашивает пользователь «abelenky», возможно, если фильтр существует в отдельной DLL. Вы можете отлаживать фильтр необработанных исключений, используя отладчик. Я сделал это, и вот как:
Вам нужно добавить код в фильтр, который отображает окно сообщения. Я использую следующий код:
#ifdef _DEBUG
AfxMessageBox (_T("At this time, you must attach the debugger to this process in order to debug the filter code."));
#endif
#Ifdef важен, потому что вы не хотите, чтобы код выполнялся в сборке выпуска. Я поместил приведенный выше код в самый верх моего фильтра.
Отладить фильтр: