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

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

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

(выделено мной)

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

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

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

2 ответа

Ознакомьтесь с разделом "Разрешение" в KB173652, в котором говорится о размещении всего кода в main/WinMain в блоке _try/_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. Вы можете отлаживать необработанный фильтр исключений с помощью отладчика. Я сделал это, и, как бы:

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

Чтобы отладить фильтр:

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

licensed under cc by-sa 3.0 with attribution.