Управление исключениями и событиями
Вы можете перехватывать и обрабатывать исключения в приложениях в пользовательском режиме и режиме ядра с помощью различных методов. Активный отладчик, отладчик postmortem или внутренняя подпрограмма обработки ошибок — это все распространенные способы обработки исключений.
Дополнительные сведения о порядке приоритета этих различных обработчиков исключений см. в разделе Включение отладки postmortem.
Когда операционная система Microsoft Windows позволяет отладчику обрабатывать исключение, приложение, создающее исключение, прерывает работу отладчика. То есть приложение останавливается, и отладчик становится активным. Затем отладчик может каким-либо образом обработать исключение или проанализировать ситуацию. Затем отладчик может завершить процесс или позволить ему возобновить работу.
Если отладчик игнорирует исключение и позволяет приложению продолжить работу, операционная система ищет другие обработчики исключений, как если бы отладчик не присутствовал. Если исключение обработано, приложение продолжает работать. Однако если исключение остается необработанным, отладчику предоставляется вторая возможность справиться с ситуацией.
Использование отладчика для анализа исключения
При возникновении исключения или события в отладчике можно использовать отладчик для проверки выполняемого кода и памяти, используемой приложением. Изменив определенные количества или перейдя к другой точке в приложении, можно удалить причину исключения.
Вы можете возобновить выполнение, выполнив команду gh (Go с обработкой исключения) или gn (Go с исключением не обработано).
Если выполнить команду gn во второй возможности отладчика для обработки исключения, приложение завершится.
Исключения в режиме ядра
Исключения, возникающие в коде в режиме ядра, являются более серьезными, чем исключения в пользовательском режиме. Если исключения в режиме ядра не обрабатываются, проверка ошибки и система останавливается.
Как и в случае с исключениями пользовательского режима, при присоединении отладчика в режиме ядра к системе отладчик получает уведомление до появления экрана проверка ошибки (также известного как синий экран). Если отладчик не подключен, появится экран проверка ошибок. В этом случае операционная система может создать файл аварийного дампа.
Управление исключениями и событиями из отладчика
Вы можете настроить отладчик для реагирования на указанные исключения и события определенным способом.
Отладчик может задать состояние приостановки для каждого исключения или события:
Событие может привести к прерыванию в отладчике сразу после его возникновения ("первый шанс").
Событие может прерваться после того, как другим обработчикам ошибок будет предоставлена возможность ответить ("второй шанс").
Событие также может отправить отладчику сообщение, но продолжить выполнение.
Отладчик может игнорировать событие.
Отладчик также может задать состояние обработки для каждого исключения и события. Отладчик может обрабатывать событие как обработанное исключение или необработанное исключение. (Конечно, события, которые на самом деле не являются ошибками, не требуют обработки.)
Вы можете управлять состоянием останова и состоянием обработки, выполнив одно из следующих действий:
Используйте команду SXE, SXD, SXN или SXI в окне Команда отладчика.
(CDB и NTSD) Используйте параметр -x, -xe, -xd, -xn или -xi в командной строке.
(CDB, NTSD и KD) Используйте ключевое слово sxe или sxd в файлеTools.ini.
(Только WinDbg) Выберите Фильтры событий в меню Отладка , чтобы открыть диалоговое окно Фильтры событий , а затем выберите нужные параметры.
Команда SX\*, параметр командной строки -x\* и Tools.ini ключевое слово sx\* обычно задают состояние приостановки указанного события. Можно добавить параметр -h , чтобы вместо этого задать состояние обработки.
Существует четыре специальных кода событий (cc, hc, bpec и ssec), которые всегда указывают состояние обработки вместо состояния прерывания.
Последнее исключение или событие можно отобразить с помощью команды .lastevent (Display Last Event).
Управление состоянием прерывания
При установке состояния прерывания исключения или события можно использовать следующие параметры.
Get-Help | Имя состояния | Описание |
---|---|---|
SXE или -xe | Break (Включено) |
При возникновении этого исключения целевой объект немедленно врывается в отладчик. Это прерывание происходит перед активацией других обработчиков ошибок. Этот метод называется обработкой первого шанса. |
SXD или -xd | Второй шанс перерыв (Отключено) |
Отладчик не прерывается для такого рода исключения первого шанса (хотя отображается сообщение). Если другие обработчики ошибок не могут устранить это исключение, выполнение останавливается, а целевой объект прерывается в отладчике. Этот метод называется обработкой второго шанса. |
SXN или -xn | Выходные данные (Уведомить) |
При возникновении этого исключения целевое приложение вообще не врывается в отладчик. Однако отображается сообщение, информирующее пользователя об этом исключении. |
SXI или -xi | Пропуск |
При возникновении этого исключения целевое приложение не врывается в отладчик и сообщение не отображается. |
Если параметр SX* не ожидает исключения, целевое приложение при втором шансе переходит в отладчик. Состояние по умолчанию для событий указано в следующем разделе "Определения событий и значения по умолчанию" этой статьи.
Чтобы задать состояние приостановки с помощью графического интерфейса WinDbg, фильтры событий в меню Отладка выберите нужное событие из списка в диалоговом окне Фильтры событий, а затем выберите Включено, Отключено, Выходные данные или Пропустить.
Управление состоянием обработки
Все события считаются необработанными, если только вы не используете команду gh (Go с обработкой исключений).
Все исключения считаются необработанными, если вы не используете команду sx\* вместе с параметром -h .
Кроме того, параметры SX* могут настраивать состояние обработки для недопустимых дескрипторов, STATUS_BREAKPOINT инструкций по прерыванию и одношагового исключения. (Эта конфигурация отделена от конфигурации прерывания.) При настройке состояния приостановки эти события будут называться ch, bpe и sse соответственно. При настройке состояния обработки эти события будут называться hc, bpec и ssec соответственно. (Полный список событий см. в следующем разделе "Определения событий и значения по умолчанию".)
Вы можете настроить состояние обработки для события CTRL+C (cc), но не для его состояния прерывания. Если приложение получает событие CTRL+C, оно всегда переходит в отладчик.
При использовании команды SX* для событий cc, hc, bpec и ssec или при использовании команды SX* вместе с параметром -h в исключении выполняются следующие действия.
Get-Help | Имя состояния | Описание |
---|---|---|
SXE |
Обрабатываются |
Событие считается обработанным при возобновлении выполнения. |
SXD, SXN, SXI |
Не обработано |
Событие считается не обработанным при возобновлении выполнения. |
Чтобы задать состояние обработки с помощью графического интерфейса WinDbg, выберите Пункт Фильтры событий в меню Отладка , выберите нужное событие в списке в диалоговом окне Фильтры событий , а затем выберите Обработано или Не обработано.
Автоматические команды
Отладчик также позволяет задавать команды, которые выполняются автоматически, если событие или исключение вызывают прерывание в отладчике. Можно задать командную строку для прерывания первого шанса и командную строку для перерыва второго шанса. Эти строки можно задать с помощью команды SX\* или отладки | Команда "Фильтры событий ". Каждая строка команд может содержать несколько команд, разделенных точкой с запятой.
Эти команды выполняются независимо от состояния прерывания. То есть, если состояние останова — "Игнорировать", команда по-прежнему выполняется. Если состояние разрыва — "Второй шанс перерыва", команда первого шанса выполняется при первом возникновении исключения, прежде чем будут задействованы другие обработчики исключений. Командная строка может заканчиваться командой выполнения, например g (Go), gh (Go с обработкой исключения) или gn (Go с исключением не обработано) .
Определения событий и значения по умолчанию
Вы можете изменить состояние прерывания или состояние обработки следующих исключений. По умолчанию указано их состояние разрыва.
Состояние обработки следующих исключений по умолчанию всегда — "Не обработано". Будьте внимательны при изменении этого состояния. Если изменить это состояние на "Обработано", все исключения первого и второго случая этого типа считаются обработанными, и эта конфигурация обходит все подпрограммы обработки исключений.
Код события | Значение | Состояние разрыва по умолчанию |
---|---|---|
asrt |
Сбой проверочного утверждения |
Разбиение |
Av |
Нарушение прав доступа |
Разбиение |
Dm |
Неправильное сопоставление данных |
Разбиение |
Dz |
Целочисленное деление на ноль |
Разбиение |
c000008e |
Деление с плавающей запятой на ноль |
Разбиение |
eh |
Исключение C++ EH |
Второй шанс перерыв |
Gp |
Нарушение страницы "Защита" |
Разбиение |
Ii |
Недопустимая инструкция |
Второй шанс перерыв |
Iov |
Переполнение целых чисел |
Разбиение |
Ip |
Ошибка страничного ввода-вывода |
Разбиение |
Isc |
Недопустимый системный вызов |
Разбиение |
lsq |
Недопустимая последовательность блокировки |
Разбиение |
sbo |
Stack buffer overflow; |
Разбиение |
Sov |
Stack Overflow |
Разбиение |
wkd |
Отладчик пробуждения |
Разбиение |
Aph |
Зависание приложения Это исключение активируется, если операционная система Windows заключает, что процесс перестал отвечать (то есть завис). |
Разбиение |
3c |
Завершение работы дочернего приложения |
Второй шанс перерыв |
chhc |
Недопустимый дескриптор |
Разбиение |
Число |
Любое нумерованное исключение |
Второй шанс перерыв |
Примечание Вы можете переопределить состояние разрыва asrt для определенного адреса с помощью команды ah (обработка утверждений). Коды событий ch и hc ссылаются на одно и то же исключение. При управлении состоянием разрыва используйте sx* ch. При управлении состоянием обработки используйте sx* hc.
Вы можете изменить состояние прерывания или состояние обработки следующих исключений. По умолчанию указано их состояние разрыва.
Состояние обработки по умолчанию для следующих исключений всегда — "Обработано". Так как эти исключения используются для взаимодействия с отладчиком, обычно не следует изменять их состояние на "Не обработано". Это состояние приводит к тому, что другие обработчики исключений перехватывают исключения, если отладчик игнорирует их.
Приложение может использовать DBG_COMMAND_EXCEPTION (dbce) для взаимодействия с отладчиком. Это исключение похоже на точку останова, но вы можете использовать команду SX*, чтобы реагировать на это исключение определенным образом.
Код события | Значение | Состояние разрыва по умолчанию |
---|---|---|
dbce |
Специальное исключение команды отладчика |
Игнорировать |
vcpp |
Специальное исключение Visual C++ |
Игнорировать |
Wos |
Одношаговая ошибка WOW64 |
Разбиение |
Wob |
Исключение точки останова WOW64 |
Разбиение |
Sse |
Одношаговая исключение |
Разбиение |
bpe |
Исключение точки останова |
Разбиение |
Cce |
CTRL+C или CTRL+BREAK Это исключение активируется, если целевым объектом является консольное приложение и в него передается клавиши CTRL+C или CTRL+BREAK. |
Разбиение |
Примечание Последние три исключения в предыдущей таблице имеют два разных кода событий. При управлении состоянием прерывания используйте sse, bpe и cce. При управлении состоянием обработки используйте ssec, bpec и cc.
Следующие исключения полезны при отладке управляемого кода.
Код события | Значение | Состояние по умолчанию |
---|---|---|
Clr |
Исключение СРЕДЫ CLR |
Второй шанс перерыв Не обработано |
clrn |
Исключение уведомления среды CLR |
Второй шанс перерыв Обработанные |
Вы можете изменить состояние останова для следующих событий. Так как эти события не являются исключениями, состояние их обработки не имеет значения.
Код события | Значение | Состояние останова по умолчанию |
---|---|---|
ser |
Системная ошибка |
Игнорировать |
cpr[:Process] |
Создание процесса Установка состояния приостановки этого события применяется только к отладке в пользовательском режиме. Это событие не происходит в режиме ядра. Управлять этим событием можно только при активации отладки дочерних процессов в CDB или WinDbg с помощьюпараметра командной строки -o или команды .childdbg (отладка дочерних процессов). Имя процесса может включать необязательное расширение имени файла и звездочку () или вопросительный знак (?) в качестве подстановочных знаков. Отладчик запоминает только последний параметр CPR . Отдельные параметры для отдельных процессов не поддерживаются. Включите двоеточие или пробел между cpr и Process. Если параметр Process не указан, параметр применяется к любому созданию дочернего процесса. |
Игнорировать |
epr[:Process] |
Завершение процесса Установка состояния приостановки этого события применяется только к отладке в пользовательском режиме. Это событие не происходит в режиме ядра. Управлять этим событием можно только при активации отладки дочерних процессов в CDB или WinDbg с помощьюпараметра командной строки -o или команды .childdbg (отладка дочерних процессов). Имя процесса может включать необязательное расширение имени файла и звездочку () или вопросительный знак (?) в качестве подстановочных знаков. Отладчик запоминает только последний параметр epr . Отдельные параметры для отдельных процессов не поддерживаются. Включите двоеточие или пробел между epr и Process. Если параметр Process опущен, параметр применяется к выходу из любого дочернего процесса. |
Игнорировать |
ct |
Создание потока |
Игнорировать |
Et |
Выход потока |
Игнорировать |
ld[:Module] |
Загрузка модуля Если указать module, разрыв происходит при загрузке модуля с таким именем. Модуль может указать имя или адрес модуля. Если используется имя, модуль может содержать различные подстановочные знаки и описатели. (Дополнительные сведения о синтаксисе см. в разделе Синтаксис строковых подстановочных знаков.) Отладчик запоминает только последний параметр ld . Отдельные параметры для отдельных модулей не поддерживаются. Включите двоеточие или пробел между ld и module. Если параметр Module опущен, событие активируется при загрузке любого модуля. |
Выходные данные |
ud[:Module] |
Выгрузка модуля Если указать модуль, прерывание происходит при выгрузке модуля с этим именем или по этому базовому адресу. Модуль может указать имя или адрес модуля. Если используется имя, модуль может быть точным именем или содержать подстановочные знаки. Если module является точным именем, он немедленно разрешается в базовый адрес с помощью текущего списка модулей отладчика и сохраняется как адрес. Если модуль содержит подстановочные знаки, строка шаблона сохраняется для последующего сопоставления при возникновении событий выгрузки. В редких случаях отладчик не имеет сведений об имени для событий выгрузки и соответствует только базовому адресу. Таким образом, если модуль содержит подстановочные знаки, отладчик не может выполнить сопоставление имени в данном конкретном случае выгрузки и прерывает работу при выгрузке любого модуля. Отладчик запоминает только последний параметр UD . Отдельные параметры для отдельных модулей не поддерживаются. Включите двоеточие или пробел между ud и module. Если параметр Module опущен, событие активируется при загрузке любого модуля. |
Выходные данные |
out[:Output] |
Выходные данные целевого приложения Если указать выходные данные, разрыв происходит только при получении выходных данных, соответствующих указанному шаблону. Выходные данные могут содержать различные подстановочные знаки и описатели. (Дополнительные сведения о синтаксисе см. в разделе Синтаксис строковых подстановочных знаков.) Однако выходные данные не могут содержать двоеточие или пробелы. Заглавные и строчные буквы не различаются. Включите двоеточие или пробел между выходом и выходными данными. |
Игнорировать |
Ibp |
Начальная точка останова (Это событие возникает в начале сеанса отладки и после перезагрузки целевого компьютера.) |
В пользовательском режиме: Перерыв. Вы можете изменить это состояние на "Пропустить" с помощью параметра командной строки-g. В режиме ядра: Игнорировать. Вы можете изменить это состояние на "Включено" различными способами. Дополнительные сведения об изменении этого состояния см. в разделе Сбой и перезагрузка целевого компьютера. |
Iml |
Начальная загрузка модуля (Только в режиме ядра) |
ограничение игнорируется. Вы можете изменить это состояние на "Break" различными способами. Дополнительные сведения об изменении этого состояния см. в разделе Сбой и перезагрузка целевого компьютера. |