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


Включение отладки postmortem

Обработка исключений в режиме пользователя

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

Наиболее распространенные ошибки приложения называются исключениями. К ним относятся нарушения доступа, ошибки деления по нулю, числовые переполнения, исключения СРЕДЫ CLR и многие другие виды ошибок. Приложения также могут вызывать прерывания точки останова. Они возникают, когда Windows не может запустить приложение (например, если не удается загрузить необходимый модуль) или при обнаружении точки останова. Точки останова можно вставить в код отладчиком или вызвать через функцию, например DebugBreak.

Приоритет обработчиков исключений

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

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

    Если отладчик пользовательского режима подключен, другие методы обработки ошибок не будут использоваться, даже если используется команда gn (Go With Exception Not Handled).

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

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

    Подключения отладки ядра должны быть открыты во время загрузки Windows. Если вы хотите запретить прерывание пользовательского режима отладчику ядра, можно использовать служебную программу KDbgCtrl с параметром -du . Дополнительные сведения о настройке подключений к отладке ядра и использовании KDbgCtrl см. в статье "Настройка для отладки".

    В отладчике ядра можно использовать gh (Go With Exception Handled), чтобы игнорировать ошибку и продолжить выполнение целевого объекта. Вы можете использовать gn (Go With Exception Not Handled) для обхода отладчика ядра и перейти к шагу 4.

  4. Если условия, описанные в шагах 1, 2 и 3, не применяются, Windows активирует средство отладки, настроенное в значениях реестра AeDebug. Любую программу можно выбрать заранее в качестве средства, используемого в этой ситуации. Выбранная программа называется отладчиком postmortem.

  5. Если условия, описанные в шагах 1, 2 и 3, не применяются, и нет отладчика postmortem, отчеты об ошибках Windows (WER) отображает сообщение и предоставляет решения, если они доступны. WER также записывает файл дампа памяти, если соответствующие значения заданы в реестре. Дополнительные сведения см. в разделе "Использование WER " и "Сбор дампов в пользовательском режиме".

Функция DebugBreak

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

Указание отладчика Postmortem

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

Разделы реестра отладчика Post Mortem

отчеты об ошибках Windows (WER) создает процесс отладчика postmortem с помощью значений, заданных в разделе реестра AeDebug.

Программное обеспечение\HKLM\Microsoft\Windows NT\CurrentVersion\AeDebug

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

Отладчик (REG_SZ)

Это значение REG_SZ указывает отладчик, который будет обрабатывать отладку после замора.

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

Командная строка создается из строки отладчика с помощью вызова стиля printf, включающего 3 параметра. Несмотря на исправление заказа, не требуется использовать какие-либо или все доступные параметры.

DWORD (%ld) — идентификатор процесса целевого процесса.

DWORD (%ld) — дескриптор событий, повторяющийся в процессе отладчика postmortem. Если отладчик postmortem сигнализирует о событии, WER продолжит целевой процесс, не ожидая завершения отладчика postmortem. Событие должно быть сигнализировать только в том случае, если проблема устранена. Если отладчик postmortem завершается без сигнала о событии, WER продолжает сбор сведений о целевых процессах.

void* (%p) — адрес структуры JIT_DEBUG_INFO, выделенной в адресном пространстве целевого процесса. Структура содержит дополнительные сведения об исключении и контексте.

Авто (REG_SZ) Это значение REG_SZ всегда равно 0 или 1.

Если для параметра "Авто " задано значение 0, перед запуском процесса отладки после завершения отладки отображается поле подтверждения.

Если для параметра Auto задано значение 1, отладчик postmortem немедленно создается.

При ручном редактировании реестра сделайте это очень тщательно, так как неправильные изменения в реестре могут не позволить Windows загружаться.

Пример использования командной строки

Многие отладчики postmortem используют командную строку, включающую переключатели -p и -e, чтобы указать, что параметры являются piD и Event (соответственно). Например, установка WinDbg с помощью windbg.exe -I создает следующие значения:

Debugger = "<Path>\WinDbg -p %ld -e %ld -g"
Auto = 1

Существует гибкость в том, как можно использовать параметры WER %ld %ld %p. Например, Нет необходимости указывать параметры WER или между ними. Например, при установке Windows Sysinternals ProcDump создаются procdump.exe -i следующие значения без переключения между параметрами WER %ld %ld %p:

Debugger = "<Path>\procdump.exe" -accepteula -j "c:\Dumps" %ld %ld %p
Auto = 1

32 и 64-разрядные отладчики

На 64-разрядной платформе значения реестра отладчика (REG_SZ) и автоматического (REG_SZ) определяются отдельно для 64-разрядных и 32-разрядных приложений. Дополнительный ключ Windows в Windows (WOW) используется для хранения 32-разрядных значений отладки приложения после смерти.

HKLM\Software\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug

На 64-разрядной платформе используйте 32-разрядный отладчик post-mortem для 32-разрядных процессов и 64-разрядной отладчик для 64-разрядных процессов. Это позволяет избежать 64-разрядного отладчика, ориентированного на потоки WOW64 вместо 32-разрядных потоков в 32-разрядном процессе.

Для многих отладчиков postmortem, включая средства отладки для отладчиков postmortem Для Windows, это включает в себя выполнение команды установки дважды; один раз с версией x86 и один раз с версией x64. Например, чтобы использовать WinDbg в качестве интерактивного отладчика postmortem, windbg.exe -I команда будет выполняться дважды один раз для каждой версии.

64-разрядная установка:

C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\windbg.exe –I

Это обновляет раздел реестра с этими значениями.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug
Debugger = "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\windbg.exe" -p %ld -e %ld –g

32-разрядная установка:

C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\windbg.exe –I

Это обновляет раздел реестра с этими значениями.

HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug
Debugger = "C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\windbg.exe" -p %ld -e %ld –g

Настройка отладчиков Post Mortem

Средства отладки для Windows

Средства отладки для отладчиков Windows все поддерживаются в качестве отладчика postmortem. Команда установки предназначена для интерактивной отладки процесса.

WinDbg

Чтобы задать отладчик postmortem в WinDbg, выполните команду windbg -I. (Должен I быть заглавным.) Эта команда отобразит сообщение об успешном выполнении или сбое после его использования. Чтобы работать с 32 и 64-разрядными приложениями, выполните команду для отладчиков 64 и 32.

C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\windbg.exe –I
C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\windbg.exe –I

Вот как будет настроена запись реестра AeDebug при windbg -I запуске.

Debugger = "<Path>\WinDbg -p %ld -e %ld -g"
Auto = 1

В примерах Путь> — это каталог, <в котором находится отладчик.

Параметры -p и -e передают идентификатор процесса и событие, как описано ранее.

Команда -g передает команду g (Go) в WinDbg и продолжает выполнение из текущей инструкции.

Обратите внимание , что существует важная проблема, связанная с передачей команды g (Go). Проблема с этим подходом заключается в том, что исключения не всегда повторяются, как правило, из-за временных условий, которые больше не существуют при перезапуске кода. Дополнительные сведения об этой проблеме см. в разделе .jdinfo (использование JIT_DEBUG_INFO).

Чтобы избежать этой проблемы, используйте jdinfo или .dump /j. Такой подход позволяет отладчику находиться в контексте интересующего вас сбоя кода. Дополнительные сведения см. в разделе JIT-отладка далее в этом разделе.

CDB

Чтобы установить отладчик postmortem на CDB, запустите cdb -iae (Install AeDebug) или cdb -iaec KeyString (Install AeDebug with Command).

C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\cdb.exe -iae
C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\cdb.exe -iae

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

C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\cdb.exe -iaec [KeyString]
C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\cdb.exe -iaec [KeyString]

Эта команда не отображает ничего, если она выполнена успешно, и сообщение об ошибке при сбое.

NTSD

Чтобы задать отладчик postmortem на NTSD, запустите ntsd -iae (Install AeDebug) или ntsd -iaec KeyString (Install AeDebug with Command).

C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\ntsd.exe -iae
C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\ntsd.exe -iae

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

C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\ntsd.exe -iaec [KeyString]
C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\ntsd.exe -iaec [KeyString]

Эта команда не отображает ничего, если она выполнена успешно, и ошибка в новом окне консоли при сбое.

Обратите внимание , что параметры -p %ld -e %ld -g всегда отображаются в командной строке отладчика postmortem, не следует использовать параметр -iaec, чтобы указать параметр -server, так как -server не будет работать, если только он не отображается в командной строке. Чтобы установить отладчик postmortem, включающий этот параметр, необходимо вручную изменить реестр.

Отладчик JIT Visual Studio

Если Visual Studio установлен, vsjitdebugger.exe будет зарегистрирован в качестве отладчика после смерти. Отладчик JIT Visual Studio намерен выполнить интерактивную отладку процесса.

Debugger = "C:\WINDOWS\system32\vsjitdebugger.exe" -p %ld -e %ld

Если Visual Studio обновлена или повторно установлена, эта запись будет перезаписана, перезаписав любые альтернативные значения.

Окно Sysinternals ProcDump

Служебная программа ProcDump для Windows Sysinternals также может использоваться для отслеживания дампа postmortem. Дополнительные сведения об использовании и скачивании ProcDump см. в разделе ProcDump.

Как и команда WinDbg дампа, ProcDump может записывать дамп аварийного сбоя, не интерактивно. Запись может происходить в любом системном сеансе Windows.

ProcDump завершает работу после завершения записи файла дампа, WER затем сообщает об ошибке и завершается процесс сбоя.

Используйте procdump -i для установки procdump и -you, чтобы удалить ProcDump для отладки 32 и 64-разрядной послеморозной отладки.

<Path>\procdump.exe -i

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

Параметры командной строки ProcDump в реестре задаются следующим образом:

Debugger = <Path>\ProcDump.exe -accepteula -j "<DumpFolder>" %ld %ld %p

ProcDump использует все 3 параметра — PID, Event и JIT_DEBUG_INFO. Дополнительные сведения о параметре JIT_DEBUG_INFO см. в разделе JIT-отладка ниже.

Размер дампа, записанного по умолчанию для mini (process/threads/handles/modules/address space) без набора параметров размера, MiniPlus (мини плюс MEM_PRIVATE страниц) с набором -mp или full (все память — эквивалентно .dump /mA) с параметром -ma set.

Для систем с достаточным объемом дискового пространства рекомендуется записать полное (ma).

Используйте -ma с параметром -i, чтобы указать всю запись памяти. При необходимости укажите путь к файлам дампа.

<Path>\procdump.exe -ma -i c:\Dumps

Для систем с ограниченным пространством на диске рекомендуется запись MiniPlus (mp).

<Path>\procdump.exe -mp -i c:\Dumps

Папка для сохранения файла дампа необязательна. По умолчанию используется текущая папка. Папка должна защититься с помощью ACL, равной или лучше используемой для C:\Windows\Temp. Дополнительные сведения об управлении безопасностью, связанной с папками, см. в разделе "Безопасность во время отладки postmortem".

Чтобы удалить ProcDump в качестве отладчика postmortem и восстановить предыдущие параметры, используйте параметр -u (Удалить).

<Path>\procdump.exe -u

Дополнительные сведения о ProcDump см. в справочнике администратора ProcDump и Windows SysInternals от Марка Руссиновича и Аарона Маргоза, опубликованного Microsoft Press.

JIT-отладка

Настройка контекста для приложения сбоя

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

Средства отладки для Windows

В этом примере показано, как изменить реестр для выполнения начальной команды (-c), которая использует команду jdinfo <address> для отображения дополнительных сведений об исключении и изменения контекста в расположение исключения (аналогично тому, как используется ECXR для записи исключений).

Debugger = "<Path>\windbg.exe -p %ld -e %ld -c ".jdinfo 0x%p"
Auto = 1

Параметр %p — это адрес структуры JIT_DEBUG_INFO в адресном пространстве целевого процесса. Параметр %p предварительно добавляется с 0x, чтобы он интерпретировался как шестнадцатеричное значение. Дополнительные сведения см. в разделе .jdinfo (использование JIT_DEBUG_INFO).

Чтобы выполнить отладку 32-разрядных приложений и 64-разрядных приложений, настройте как 32, так и 64-разрядные разделы реестра (описанные выше), задайте правильный путь к расположению 64-разрядной и 32-разрядной WinDbg.exe.

Создание файла дампа с помощью дампа

Чтобы записать файл дампа всякий раз, когда происходит сбой, содержащий данные JIT_DEBUG_INFO, используйте дамп /j <address>.

<Path>\windbg.exe -p %ld -e %ld -c ".dump /j %p /u <DumpPath>\AeDebug.dmp; qd"

Используйте параметр /u для создания уникального имени файла, чтобы разрешить автоматическое создание нескольких файлов дампа. Дополнительные сведения о параметрах см . в разделе .dump (Create Dump File).

Созданный дамп будет содержать данные JITDEBUG_INFO, хранящиеся в качестве контекста исключения по умолчанию. Вместо использования Jdinfo для просмотра сведений об исключении и задания контекста используйте EXR-1 для отображения записи исключений и ECXR для задания контекста. Дополнительные сведения см. в разделе .exr (Display Exception Record) and .ecxr (Display Exception Context Record).

отчеты об ошибках Windows - q / qd

Способ завершения сеанса отладки определяет, сообщает ли отчеты об ошибках Windows о сбое.

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

Если сеанс отладки завершает работу с использованием q (или если отладчик закрыт без отключения), WER не сообщит об ошибке.

Добавление ; q или ; qd до конца командной строки для вызова требуемого поведения.

Например, чтобы разрешить WER сообщить об ошибке после записи дампа, настройте эту командную строку.

<Path>\cdb.exe -p %ld -e %ld -c ".dump /j 0x%p /u c:\Dumps\AeDebug.dmp; qd"

Этот пример позволит WER сообщить о сбое после записи дампа WinDbg.

<Path>\windbg.exe -p %ld -e %ld -c ".dump /j %p /u <DumpPath>\AeDebug.dmp; qd""

Уязвимости системы безопасности

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