Управление исключениями и событиями

Вы можете перехватывать и обрабатывать исключения в приложениях в пользовательском режиме и режиме ядра с помощью различных методов. Активный отладчик, отладчик 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
ssec

Одношаговая исключение

Разбиение

bpe
bpec

Исключение точки останова

Разбиение

Cce
См3

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" различными способами. Дополнительные сведения об изменении этого состояния см. в разделе Сбой и перезагрузка целевого компьютера.