Поделиться через


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

Вы можете перехватывать и обрабатывать исключения в приложениях в пользовательском режиме и в режиме ядра различными методами. Активный отладчик, отладчик postmortem или внутренняя подпрограмма обработки ошибок являются общими способами обработки исключений.

Дополнительные сведения о порядке приоритета этих различных обработчиков исключений см. в разделе Включение отладки после завершения работы.

Когда операционная система Microsoft Windows позволяет отладчику обрабатывать исключение, приложение, создающее исключение, прерывает работу отладчика. То есть приложение останавливается, а отладчик становится активным. Отладчик может обрабатывать исключение каким-то образом или анализировать ситуацию. Отладчик может завершить процесс или позволить ему возобновить работу.

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

Использование отладчика для анализа исключения

Когда исключение или событие приводит к запуску отладчика, вы можете использовать отладчик для проверки выполняемого кода и памяти, используемой приложением. Изменив определенные количества или перейдя к другой точке приложения, вы можете удалить причину исключения.

Вы можете возобновить выполнение, выпустив команду gh (Go с обработанным исключением) или gn (Go с необработанным исключением).

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

исключенияKernel-Mode

Исключения, возникающие в коде в режиме ядра, являются более серьезными, чем исключения в пользовательском режиме. Если исключения в режиме ядра не обрабатываются, выполняется проверка ошибок и система останавливается.

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

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

Отладчик можно настроить для реагирования на указанные исключения и события определенным образом.

Отладчик может задать статус останова для каждого исключения или события.

  • Событие может вызвать разрыв в отладчике сразу после его возникновения (первый шанс).

  • Событие может сработать после того, как другие обработчики ошибок получат возможность ответить (второй шанс).

  • Событие также может отправить отладчику сообщение, но продолжить выполнение.

  • Отладчик может игнорировать событие.

Отладчик также может задать состояние обработки для каждого исключения и события. Отладчик может обрабатывать событие как обработанное исключение или необработанное исключение. (Конечно, события, которые на самом деле не являются ошибками, не требуют обработки.)

Вы можете управлять статусом паузы и статусом выполнения, выполнив одно из этих действий.

  • Используйте команду SXE, SXD, SXN или SXI в окне команды отладчика.

  • (CDB и NTSD) Используйте параметр -x, -xe, -xd, -xn или -xi в командной строке.

  • (CDB, NTSD и KD) Используйте ключевое слово sxe или sxd в файлеTools.ini .

  • (только WinDbg) Выберите фильтры событий в меню отладки , чтобы открыть диалоговое окно "Фильтры событий ", а затем выберите нужные параметры.

Команда SX\* , параметр командной строки -x\* и ключевое слово sx\* Tools.ini обычно задает состояние разрыва указанного события. Можно добавить параметр -h , чтобы вместо этого задать состояние обработки.

Существует четыре специальных кода событий (cc, hc, bpec и ssec), которые всегда указывают состояние обработки вместо состояния разрыва.

Вы можете отобразить последнее исключение или событие с помощью команды Lastevent (Display Last Event).

Управление статусом останова

При установке статуса остановки исключения или события можно использовать следующие параметры.

командование Имя состояния Описание

SXE или -xe

Перерыв

(включено)

При возникновении этого исключения целевой объект немедленно переходит в отладчик. Эта остановка происходит перед активацией других обработчиков ошибок. Этот метод называется обработкой первого шанса.

SXD или -xd

Второй шанс перерыв

(Отключено)

Отладчик не останавливается на таком исключении первого шанса (хотя отображается сообщение). Если другие обработчики ошибок не могут устранить это исключение, выполнение останавливается, и управление передается в отладчик. Этот метод называется обработкой второго шанса.

SXN или -xn

Выходные данные

(Уведомление)

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

SXI или -xi

Ignore

При возникновении этого исключения целевое приложение не запускает отладчик, и сообщение не отображается.

Если исключение не ожидается параметром SX*, целевое приложение переходит в отладчик во второй шанс. Состояние по умолчанию для событий отображается в следующем разделе "Определения событий и значения по умолчанию" этого раздела.

Чтобы задать состояние останова с помощью графического интерфейса WinDbg, фильтры событий в меню отладки выберите событие, которое требуется в списке в диалоговом окне "Фильтры событий" , а затем выберите "Включено", " Отключено", " Вывод" или "Игнорировать".

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

Все события считаются необработанными, если вы не используете команду gh (Go with Exception Handled).

Все исключения считаются необработанными, если вы не используете команду sx\* вместе с параметром -h .

Кроме того, параметры SX* могут настроить состояние обработки для недопустимых дескрипторов, инструкций прерывания STATUS_BREAKPOINT и исключений пошагового выполнения. (Эта конфигурация отличается от конфигурации останова.) При настройке состояния останова эти события называются ch, bpe и sse соответственно. При настройке состояния обработки эти события называются hc, bpec и ssec соответственно. (Полный список событий см. в следующем разделе "Определения событий и значения по умолчанию".

Вы можете настроить состояние обработки события CTRL+C (cc), но не его прерывание. Если приложение получает событие CTRL+C, приложение всегда переходит в отладчик.

При использовании команды SX* в cc, hc, bpec и ssec или при использовании команды SX* вместе с параметром -h для исключения выполняются следующие действия.

командование Название статуса Описание

SXE

Обработано

Событие считается обработанным, когда выполнение процесса возобновляется.

SXD, SXN, SXI

Не обработано

Событие считается не обработанным при возобновлении выполнения.

Чтобы задать состояние обработки с помощью графического интерфейса WinDbg, выберите фильтры событий в меню отладки, выберите нужное событие из списка в диалоговом окне "Фильтры событий", а затем выберите "Обработано" или "Не обработано".

Автоматические команды

Отладчик также позволяет задавать команды, которые автоматически выполняются, если событие или исключение вызывает разрыв в отладчике. Можно задать командную строку для первого шанса и командную строку для второго шанса. Эти строки можно задать с помощью команды SX\* или отладки | Команда "Фильтры событий ". Каждая строка команды может содержать несколько команд, разделенных точкой с запятой.

Эти команды выполняются независимо от статуса прерывания. То есть, если статус разрыва установлен на "Игнорировать", команда выполняется. Если состояние останова — "Второй шанс перерыв", команда первого шанса выполняется при первом возникновении исключения, прежде чем будут задействованы другие обработчики исключений. Командная строка может заканчиваться командой выполнения, например g (Go), gh (Go с обработчиком исключений) или gn (Go with Exception Not Handled).

Определения событий и значения по умолчанию

Вы можете изменить состояние останова или состояние обработки следующих исключений. Указывается статус разрыва по умолчанию.

Состояние обработки по умолчанию для следующих исключений всегда равно "Не обработано". Будьте осторожны при изменении этого статуса. Если изменить этот статус на "Обработано", все исключения первого и второго шанса этого типа рассматриваются как обработанные, и эта конфигурация обходит все подпрограммы обработки исключений.

Код события Значение Состояние разрыва по умолчанию

asrt

Сбой утверждения

Перерыв

av

Нарушение доступа

Перерыв

дм

Неправильное сопоставление данных

Перерыв

dz

Целочисленное деление на ноль

Перерыв

c000008e

Деление с плавающей запятой на ноль

Перерыв

эх

Исключение C++ EH

Второй шанс на удачу

gp

Нарушение охраняемой страницы

Перерыв

ii

Недопустимая инструкция

Второй шанс перерыв

iov

Целочисленное переполнение

Перерыв

IP

Ошибка ввода-вывода на странице

Перерыв

isc

Недопустимый системный вызов

Перерыв

lsq

Недопустимая последовательность блокировки

Перерыв

sbo

Переполнение буфера стека

Перерыв

sov

Переполнение стека

Перерыв

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
cc

CTRL+C или CTRL+BREAK

Это исключение активируется, если целевой объект является консольным приложением, а в него передается сочетание клавиш CTRL+C или CTRL+BREAK.

Перерыв

Заметка Последние три исключения в предыдущей таблице имеют два разных кода событий. При управлении состоянием перерыва используйте sse, bpe и cce. При управлении состоянием обработки используйте ssec, bpec и cc.

Следующие исключения полезны при отладке управляемого кода.

Код события Значение Статус по умолчанию

clr

Исключение в общей среде исполнения

Перерыв для второго шанса

Не обработано

clrn

Исключение уведомления общей языковой среды выполнения

Второй шанс на новую возможность

Обработано

Вы можете изменить статус прерывания следующих событий. Так как эти события не являются исключениями, их состояние обработки не имеет значения.

Код события Значение Статус перерыва по умолчанию

Сир

Системная ошибка

Игнорировать

cpr[:Процесс]

Создание процесса

Установка состояния разрыва этого события применяется только к отладке в пользовательском режиме. Это событие не происходит в режиме ядра.

Это событие можно контролировать только в том случае, если вы активировали отладку дочерних процессов в CDB или WinDbg, с помощьюпараметра командной строки -o или с помощью команды .childdbg (отладка дочерних процессов).

Имя процесса может включать необязательное расширение имени файла и звездочку () или вопросительный знак (?) в качестве подстановочных знаков. Отладчик запоминает только последний параметр cpr . Отдельные параметры отдельных процессов не поддерживаются. Включите двоеточие или пробел между cpr и Process.

Если процесс опущен, параметр применяется к созданию любого дочернего процесса.

Игнорировать

epr[:Процесс]

Выход из процесса

Установка состояния прерывания данного события применяется только к отладке в пользовательском режиме. Это событие не происходит в режиме ядра.

Это событие можно контролировать только в том случае, если вы активировали отладку дочерних процессов в CDB или WinDbg, с помощьюпараметра командной строки -o или с помощью команды .childdbg (отладка дочерних процессов).

Имя процесса может включать необязательное расширение имени файла и звездочку () или вопросительный знак (?) в качестве подстановочных знаков. Отладчик запоминает только последний параметр epr . Отдельные параметры отдельных процессов не поддерживаются. Включите двоеточие или пробел между epr и Process.

Если процесс опущен, параметр применяется к выходу из любого дочернего процесса.

Игнорировать

ct

Создание потока

Игнорировать

et

Выход потока

Игнорировать

ld[:Модуль]

Модуль загрузки

При указании модуля разрыв возникает при загрузке модуля с этим именем. Модуль может указать имя или адрес модуля. Если используется имя, модуль может содержать различные подстановочные знаки и спецификаторы. (Дополнительные сведения о синтаксисе см. в разделе "Синтаксис подстановочных знаков строки".)

Отладчик запоминает только последний параметр ld . Отдельные параметры для отдельных модулей не поддерживаются. Включите двоеточие или пробел между ld и Module.

Если модуль опущен, событие активируется при загрузке любого модуля.

Выходные данные

ud[:Модуль]

Выгрузка модуля

Если указать Module, сброс произойдет, когда модуль с таким именем или по этому базовому адресу будет выгружен. Модуль может указать имя или адрес модуля. Если используется имя, модуль может быть точным именем или включать подстановочные знаки. Если модуль является точным именем, он немедленно разрешается в базовый адрес с помощью текущего списка модулей отладчика и сохраняется как адрес. Если модуль содержит подстановочные знаки, строка шаблона сохраняется для последующего сопоставления при возникновении событий выгрузки.

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

Отладчик запоминает только последний параметр ud . Отдельные параметры для отдельных модулей не поддерживаются. Включите двоеточие или пробел между ud и Module.

Если модуль опущен, событие активируется при загрузке любого модуля.

Выходные данные

out[:Вывод]

Выходные данные целевого приложения

При указании выходных данных разрыв происходит только при получении выходных данных, соответствующих указанному шаблону. Выходные данные могут содержать различные подстановочные знаки и описатели. (Дополнительные сведения о синтаксисе см. в разделе "Синтаксис подстановочных знаков строки".) Однако выходные данные не могут содержать двоеточие или пробелы. Совпадение не учитывает регистр. Включите двоеточие или пробел между выходом и выводом.

Игнорировать

ibp

Начальная точка останова

(Это событие происходит в начале сеанса отладки и после перезагрузки целевого компьютера.)

В пользовательском режиме: Прерывать. Это состояние можно изменить на "Игнорировать" с помощью параметра командной строки-g.

В режиме ядра: Игнорировать. Это состояние можно изменить на "Включено" различными методами. Дополнительные сведения об изменении этого состояния см. в разделе "Сбой и перезагрузка целевого компьютера".

iml

Начальная загрузка модуля

(только режим ядра)

Игнорировать. Это состояние можно изменить на "Break" различными методами. Дополнительные сведения об изменении этого состояния см. в разделе "Сбой и перезагрузка целевого компьютера".