Можно ли отлаживать UnhandledExceptionFilters с помощью отладчика?

В Microsoft Windows API вы можете использовать SetUnhandledExceptionFilter, установить обработчик для необработанных исключений. Большой улов, упомянутый на этой странице:

Если происходит исключение в процессе, который не отлаживается, а также
исключение попадает в фильтр необработанных исключений, этот фильтр
вызовет функцию фильтра исключений, указанную
Параметр lpTopLevelExceptionFilter.

(акцент добавлен)

Что в основном означает, что если процесс отлаживается, отладчик получает исключение, и мой фильтр пропускается!

Я могу проверить & отладить мой ExceptionFilter старомодным способом, с printfs и trial-n-error.

Но я что-то упустил? Есть ли хороший способ интерактивной отладки ExceptionFilter, если он отключен в отладчике?

1

Решение

Оформить заказ Раздел разрешения 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 определить, отображать ли окно сообщения или нет.

1

Другие решения

Я знаю, что этот пост был уже давно, но я случайно наткнулся на него, ища что-то еще. Я рад сказать, что то, что спрашивает пользователь «abelenky», возможно, если фильтр существует в отдельной DLL. Вы можете отлаживать фильтр необработанных исключений, используя отладчик. Я сделал это, и вот как:

  • Фильтр исключений должен существовать в отдельной 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 важен, потому что вы не хотите, чтобы код выполнялся в сборке выпуска. Я поместил приведенный выше код в самый верх моего фильтра.

Отладить фильтр:

  1. Создайте версию выпуска своего приложения в Visual Studio
    (экземпляр № 1).
  2. Создайте отладочную версию вашего фильтра во втором экземпляре VS (# 2).
  3. Скопируйте Debug-версию фильтра в папку Release вашего
    приложение.
  4. Запустите приложение Release из меню «Отладка» без
    отладка».
  5. Вызвать сбой в вашем приложении.
  6. Когда появится окно сообщения отладки (см. Выше), перейдите ко второму экземпляру (# 2) Visual Studio.
  7. В экземпляре № 2 откройте проект фильтра в Debug (если он не открыт) и прикрепите
    отладчик для вашего экземпляра приложения.
  8. Установите точку останова в коде фильтра после отображения окна сообщения.
  9. Закройте окно сообщения, и ваша точка останова должна быть достигнута.
  10. Продолжайте отлаживать ваш код.
1

По вопросам рекламы [email protected]