#c #windows #exception #debugging
#c #Windows #исключение #отладка
Вопрос:
Я пытаюсь реализовать в c / Windows «Основной цикл отладчика», описанный в этой статье: Написание основного цикла отладчика
Но я хочу, чтобы любое генерируемое исключение отображало сообщение об ошибке в secreten и было перехвачено отладчиком. Я понял, что могу сделать это, указав ContinueDebugEvent
некоторое значение DBG_??? но я не знаю, что это такое.
Что это за значение?
Я также заметил, что консольные приложения уведомляют отладчик об исключениях, когда что-то записывается на консоль. Как я могу отфильтровать фактическое исключение из этих вещей? Имеет ли это какое-либо отношение к значению «первый шанс»?
спасибо 🙂
Комментарии:
1. Я не понимаю вашего вопроса. Ваше приложение ЯВЛЯЕТСЯ отладчиком, поэтому именно вы должны показывать сообщение об ошибке.
2. Давайте сформулируем это так: если приложение, которое я отлаживаю, делит число на 0, я хочу, чтобы оно завершилось сбоем! 🙂
3. Передайте DBG_EXCEPTION_NOT_HANDLED в ContinueDebugEvent; это говорит системе разрешить процессу продолжить его обычный механизм обработки исключений (например, ваш отладчик не обработал исключение). Если это исключение второго шанса, то система завершит процесс.
4. хорошо, но затем процесс завершается, даже если он отправляет уведомление, потому что что-то было напечатано на экране. Есть ли способ фильтровать только фатальные исключения?
5. Тьфу. По-видимому, документация неверна; вам нужно передать DBG_CONTINUE для OUTPUT_DEBUG_STRING_EVENT. maximumcrack.wordpress.com/2009/06/22 /…
Ответ №1:
Отладчик получает событие исключения для каждого исключения, возникающего в отладчике. Если вы передаете DBG_CONTINUE
в ContinueDebugEvent
, отладчик проглатывает исключение и выполнение продолжается, как будто никакого исключения не произошло в первую очередь. Это означает, что отладчик также не уведомлен об этом. Если, с другой стороны, вы передаете DBG_EXCEPTION_NOT_HANDLED
, отладчик уведомляется и отвечает за обработку исключения.
Теперь, если отладчик не обрабатывает (читай: перехватывает) исключение, отладчик получает уведомление во второй раз, на этот раз с Event.u.Exception.dwFirstChance
значением 0. На этом этапе исключение завершит процесс, если вы пройдете DBG_EXCEPTION_NOT_HANDLED
.
Следует иметь в виду две вещи:
- Обычным способом передачи строки в отладчик является
OutputDebugString
. Нет необходимости использовать самостоятельно определенные исключения, если только вам не нужно передавать что-то другое, кроме строки. - Если вы планируете создавать собственное исключение для передачи определенных событий в отладчик, проверьте
Event.u.Exception.ExceptionRecord.ExceptionCode
и посмотрите, соответствует ли оно вашему предопределенному типу исключения, и используйтеDBG_CONTINUE
в этом случае.