Настройка транспорта отладчика EXDI
В этом разделе описывается настройка отладки в режиме ядра с помощью EXDI. Интерфейс расширенной отладки (EXDI) — это уровень адаптации между отладчиком программного обеспечения и целевым объектом отладки.
Средства отладки для Windows поддерживают отладку ядра с помощью EXDI, начиная с Windows версии 22000.
Пользовательский интерфейс для настройки EXDI доступен в отладчике, начиная с версии 1.2410.11001.0.
EXDI можно использовать для установления подключения к виртуальной среде QEMU. Дополнительные сведения см. в разделе "Настройка отладки в режиме ядра QEMU с помощью EXDI".
Примечание.
EXDI — это расширенная специализированная форма отладки для определенных сред. Использование стандартного подключения KDNET проще настроить и рекомендуется. Чтобы настроить автоматическую отладку сети, см. раздел "Настройка автоматической отладки сетевого ядра KDNET".
Общие сведения о сервере EXDI COM
EXDI — это интерфейс, который расширяет WinDbg, добавив поддержку аппаратных отладчиков (например, на основе JTAG или GdbServer). На приведенной ниже схеме показана роль EXDI-GdbServer.
COM-сервер ссылается на двоичный компонент, реализующий COM-интерфейс. В этом случае exdi3.idl реализован ExdiGdbSrv.dll для клиента протокола отладчика Windows.
Сам ExdiGdbsrv.dll реализует клиентская сторона протокола GDB-RSP, на стороне сервера GDB (или когда-то называется заглушка сервера GDB) реализуется сервером QEMU GDB (или заглушкой сервера GDB Для QEMU (или Trace32/OpenOCD/UEFI GDB server и т. д.).
Так как подключение EXDI не зависит от Windows или протокола KDNET отладки Windows, загружаемого на целевом компьютере. Так как эти компоненты отладчика программного обеспечения не требуются, EXDI может оказаться полезным в начале запуска устройства и при отладке проблем с запуском ОС.
Внимание
Так как EXDI не использует протокол KDNET, подключенный отладчик имеет значительно меньше сведений о том, что выполняется на компьютере, и многие команды будут работать по-разному или не работать вообще. Доступ к частным символам для отлаживаемого кода может помочь отладчику лучше понять выполнение кода целевых систем. Дополнительные сведения см. в разделе "Открытые и частные символы".
Требования к устройству в режиме ядра EXDI
Компьютер, на котором выполняется отладчик, называется главным компьютером, а отлаживаемый компьютер называется целевым компьютером.
Требуется следующее:
На целевом и хост-компьютере поддерживаемая сетевая карта, поддерживаемая требуемой средой, например QEMU.
Сетевое подключение между целевым объектом и узлом с помощью TCP/IP.
Windows 10 или Windows 11 версии 22000 или более поздней.
Ограничения
Как описано выше, так как EXDI не использует протокол KDNET, подключенный отладчик имеет меньше сведений о целевой системе, а использование отладчика отличается. Без доступа к частным символам для целевого кода многие команды, использующие символы для понимания состояния целевой системы, не будут работать. В этом случае можно просматривать память и регистрировать содержимое и дизассемблировать код. Определение расположения запуска кода или выполнение других распространенных задач отладчика может быть очень сложным и трудоемким без закрытых символов.
Одновременная отладка EXDI и KDNET
В некоторых сложных сценариях, например в начале запуска устройства, может быть полезно иметь два подключения к целевому устройству. Один EXDI и один KDNET. Если целевой объект является ОС Windows, отладка программного обеспечения KDNET настраивается как обычно, например для подключения к виртуальной машине. В этой настройке любой из двух параллельных отладчиков может прервать отладку кода на целевом компьютере.
WinDbg на сервере обработки
Двоичный компонент EXDI может выйти из процесса Windbg или в процессе Windbg. Использование пользовательского интерфейса EXDI или Inproc=<EXDI COM server binary>
значительно повышает надежность, уменьшая ошибки запуска COM. Поэтому всегда рекомендуется запускать сеанс EXDI с параметром Inproc, который всегда включен при использовании пользовательского интерфейса.
Для запуска командной строки параметр по умолчанию не выполняется, но в обработчике следует включить этот InProc=ExdiGdbDrv.dll
параметр.
Клиент СЕРВЕРА COM GDB
В этом разделе описывается использование клиента СЕРВЕРА COM GDB EXDI (ExdiGdbSrv.dll), реализующего интерфейс отладчика EXDI COM. Можно использовать тот же com-интерфейс для реализации других интерфейсов, таких как COM-сервер EXDI для JTAG-DCI.
Сводка процесса использования подключения EXDI
Используйте этот процесс для использования подключения EXDI с WinDbg.
- Скачайте и установите средства отладки Windows в хост-системе.
- Запустите WinDbg с помощью пользовательского интерфейса или параметра -kx для подключения к серверу EXDI.
- Используйте WinDbg для отладки целевой системы с помощью подсети доступных команд отладчика.
Пример сценария использования EXDI см. в разделе Настройка отладки режима ядра QEMU с помощью EXDI.
Скачивание и установка средств отладки Windows
Установите средства отладки Windows в хост-системе. Сведения о скачивании и установке средств отладчика см. в разделе "Средства отладки" для Windows.
Запустите WinDbg и подключитесь к серверу EXDI
Следующие параметры можно настроить в пользовательском интерфейсе подключения ядра EXDI.
Целевой тип
[Trace32|BMC-OpenOCD|QEMU|VMWare|UEFI]
Select в соответствии с типом целевого объекта, который вы хотите отлаживать. Доступны следующие типы целевых объектов.- Trace32: конфигурация сервера отладчика GDB Lauterbach Trace32 HW
- BMC-OpenOCD: конфигурация сервера GDB отладчика BMC-OpenOCD HW
- QEMU: конфигурация сервера GDB симулятора QEMU SW
- VMWare: конфигурация сервера GDB VMWare
- UEFI: отладка встроенного ПО UEFI
Целевая архитектура
[x86 | ARM64 | x64]
— архитектура целевого процессора. Обратите внимание, что все целевые типы могут не поддерживать все целевые архитектуры.Целевая ОС
[Windows|Linux]
— выберите в соответствии с целевой ОС, для выполнения отладки.Сканирование изображения эвристического размера
[None | 0xFE - PreNT |0xFFE - NT]
— выберите один из трех вариантов, чтобы определить эвристические размеры для сканирования изображений. Это значение настраивает, как модуль отладчика сканирует память, ищущую подпись PE DOS, которая используется для сбора состояния execuition кода. Если значение атрибута не указано (или "0"), подсистема отладчика не будет использовать быструю эвристика и вернуться к устаревшей эвристики, которая сканирует всю память, ищущую подпись PE DOS. Значение по умолчанию выбрано для каждого целевого типа и рекомендуется.Сервер Gdb и порт
TargetIPAddress:TargetPortAddress
— задайте строку, содержащую IPTargetAddress, двоеточие и целевой портAddress. Пример:LocalHost:1234
или168.82.1.5:5555
.Разорвать подключения
[on|off]
установите флажок для разрыва в целевой объект после установки подключения.Дополнительные параметры
Отображение журнала пакетов связи. Установите флажок для отображения шестнадцатеричных значений необработанного журнала
[on|off]
пакетов связи GDBServer для отладки и устранения неполадок.
После выбора нужных параметров нажмите кнопку "ОК ", чтобы подключиться.
Настройка дополнительных параметров с помощью XML-файлов конфигурации EXDI
Наиболее необходимые параметры доступны в пользовательском интерфейсе, описанном в этом разделе. Сведения о настройке дополнительных параметров с помощью XML-файлов конфигурации EXDI см. в файлах конфигурации EXDI XML.
Пример EXDI командной строки WinDbg
Чтобы запустить сеанс windbg, использующий интерфейс EXDI в командной строке, используйте эти параметры.
c:\Debuggers> windbg.exe -v -kx exdi:CLSID={29f9906e-9dbe-4d4b-b0fb-6acf7fb6d014},Kd=Guess,InProc=ExdiGdbDrv.dll,DataBreaks=Exdi
Чтобы отобразить дополнительные выходные данные, полезные для диагностики, можно использовать подробный сеанс -v. Общие сведения о параметрах WinDbg см. в разделе "Параметры командной строки WinDbg". Дополнительные сведения см. в разделе параметров загрузки WinDbg EXDI ниже.
Консоль отладчика отобразит инициализацию транспорта EXDI.
EXDI: DbgCoInitialize returned 0x00000001
EXDI: CoCreateInstance() returned 0x00000000
EXDI: QueryInterface(IExdiServer3) returned 0x00000000
EXDI: Server::GetTargetInfo() returned 0x00000000
EXDI: Server::SetKeepaliveInterface() returned 0x00000000
EXDI: Server::GetNbCodeBpAvail() returned 0x00000000
EXDI: ExdiNotifyRunChange::Initialize() returned 0x00000000
EXDI: LiveKernelTargetInfo::Initialize() returned 0x00000000
EXDI: Target initialization succeeded
Kernel Debugger connection established
Окно консоли EXDIGdbServer также может отображать сведения о состоянии подключения EXDI. Дополнительные сведения о консоли см. в разделе "Устранение неполадок".
Параметры загрузки ExDI WinDbg
Для запуска сеанса ядра EXDI используются следующие параметры с WinDbg.
-kx EXDI:Options
Следующие параметры EXDI доступны с параметром -kx. Каждый параметр должен быть разделен с помощью запятой.
Параметр | Описание |
---|---|
CLSID | Идентификатор класса, назначенный LiveExdiGdbSrvServer (как определено в файлеExdiGdbSrv.idl). |
Kd=Guess -or- NtBaseAddr | Обработчик отладчика будет использовать общий эвристические механизмы или искать базовый адрес NT. |
ForceX86 | Принудительно заставляет обработчик отладчика использовать интерфейс IeXdiX86Context3 для получения и настройки контекста ЦП. |
DataBreaks=Exdi | Разрешить использование точек останова данных. |
Inproc | Разрешить использование inproc Exdi-Server. Этот параметр рекомендуется — InProc=ExdiGdbDrv.dll |
PathToSrvCfgFiles | Путь к XML-файлам конфигурации для EXDI. |
Контроль эвристического поиска и эвристического размера
Как описано ранее, отладчик использует эвристические алгоритмы для поиска базового адреса NT. Чтобы отменить эвристические поиски, при запуске WinDbg с помощью командной строки выполните следующие действия.
- Задайте для эвристикаScanSize значение 0 в файле exdiconfigdata.xml для целевого сервера, к которому будет присоединено.
- Используйте эвристические типы в командной строке
kd=NtBaseAddr
Windbg.
Дополнительные сведения о работе с XML-файлами конфигурации см. в файлах конфигурации EXDI XML.
Отладка целевой системы с помощью WinDbg — точек останова
Dbgeng.dll использует эвристические алгоритмы для поиска расположения базового адреса загрузки NT во время выполнения команды останова. Если закрытые символы недоступны, этот процесс завершится ошибкой.
Это означает, что при множестве последовательностей подключений разрыв не будет функционировать должным образом. Если вы вручную войдете в код, это будет случайное расположение, которое Windows выполнялось в данный момент. Так как символы целевого кода могут быть недоступны, может быть трудно задать точки останова с помощью символов.
Команды отладчика
Команды, такие как указанные ниже, напрямую будут работать для доступа к памяти.
k, kb, kc, kd, kp, kP, kv (Display Stack Backtrace)
d, da, db, dc, dd, dD, df, dp, dq, du, dw (display Memory)
И вы можете выполнить пошаговое выполнение кода с помощью P (Step).
Существуют также команды, которые можно использовать для поиска кода, который требуется выполнить отладку.
.imgscan (поиск заголовков изображений)
Imgscan может быть полезным при отладке EDXI, так как в отличие от традиционной отладки ядра на основе KDNET, установка точек останова на основе символов может быть недоступна. Поиск требуемого целевого образа может упростить использование его расположения для задания точки останова доступа к памяти.
.exdicmd (команда EXDI)
Exdicmd отправляет команду EXDI в целевую систему с помощью активного подключения отладки EXDI. Дополнительные сведения см. в разделе .exdicmd (команда EXDI).
Устранение неполадок
Используйте выходные данные из окна ExdiGdbServer для мониторинга последовательности подключений.
Проблема: ошибка: не удается установить соединение с GbDServer. Проверка строка подключения <hostname/ip>:portnumber
Эта проблема может быть вызвана следующими причинами:
- ExdiGdbSrv.dll не удается подключиться к целевому серверу GDB.
- Сервер GDB еще не запущен в целевом объекте.
- Проблемы с брандмауэром, убедитесь, что оба IP-адреса доступны с помощью ping, tracert или другого средства, чтобы убедиться, что трафик GDB может проходить через брандмауэр.
Проблема. Сценарий ошибки с целевой системой недоступен — DbgCoInitialize возвращается 0x00000001
Следующие выходные данные могут быть возвращены, если целевая система не загружена или недоступна.
Microsoft (R) Windows Debugger Version 10.0.20317.1 AMD64
Copyright (c) Microsoft Corporation. All rights reserved.
EXDI: DbgCoInitialize returned 0x00000001
Это распространенная ошибка, когда ExdiGdbSrv.dll COM-сервер не удалось подключиться к GDServer QEMU, поэтому это может привести к сбою из-за:
Предыдущий сеанс ExdiGdbSrv.dll по-прежнему размещен процессом dllhost.exe, поэтому необходимо убить процесс dllhost.exe. Используйте
TaskList
в командной строке идентификатор идентификатора dllhost.exe, на котором размещается ExdiGdbSrv.dll. Используйте и убьетTaskKill /PID <PID ID> /f
связанный идентификатор пин-код. Дополнительные сведения о работе с piD см. в разделе "Поиск идентификатора процесса".Сервер gdbserver QEMU еще не запущен или файл exdiconfigdata.xml содержит недопустимые значения IP:Port. Если сеанс WinDbg запускается на том же компьютере узла, что и виртуальная машина Windows QEMU, то IP=LocalHost.
Сбой при запуске COM-сервера EXDI (ExdiGDbSrv.dll) через процесс dllhost.exe (связанный COM). Чтобы устранить эту проблему, перезапустите компьютер отладчика узла или снова войдите в Систему и выполните вход. Если это не работает, повторно зарегистрируйте COM-сервер EXDI после перезапуска или входа снова.
regsvr32.exe <full path to the ExdiGdbSrv.dll)
Проблема. Не удалось запустить сеанс отладки: FAILURE HR=0x80004005:Failed to AttachKernel.
Эта проблема может быть вызвана следующими причинами:
- Как описано выше, возможно, что предыдущий сеанс ExdiGdbSrv.dll по-прежнему активен. Найдите и завершите связанный узел DLL, как описано выше.
Проблема. Не удалось запустить отладку ядра с помощью EXDI.
Эта проблема может быть вызвана следующими причинами:
- Существует еще один экземпляр ExdiGdbSrv.dll (размещенного dllhost.exe) на компьютере отладчика узла.
- Завершите дополнительный экземпляр службы COM, на котором размещена ExdiGdbSrv.dll.
- Сначала перечислить процессы с помощью служебной программы, например TList на хост-компьютере. DLLHost, на котором размещена ExdiGdbSrv.dll, будет отображаться ExdiGdbServer.
tlist 261928 dllhost.exe ExdiGdbServer
- Используйте
kill -f XXXXX
в командной строке отладчика, чтобы завершить процесс с помощью номера процесса.
- Сначала перечислить процессы с помощью служебной программы, например TList на хост-компьютере. DLLHost, на котором размещена ExdiGdbSrv.dll, будет отображаться ExdiGdbServer.
Проблема: ошибка: не удается настроить сеанс GdbServer.
Эта проблема может быть вызвана следующими причинами:
- Произошла ошибка при поиске сведений о сеансе, таких как путь к XML-файлам конфигурации.
Проблема. Ошибка: переменная среды EXDI_GDBSRV_XML_CONFIG_FILE не определена.
Эта проблема может быть вызвана следующими причинами:
- ExdiGdbSrv.dll переменные среды не заданы или в противном случае недоступны в среде.
Проблема. Ошибка: переменная среды EXDI_GDBSRV_XML_CONFIG_FILE не определена. Пример Exdi-GdbServer не будет продолжаться на этом этапе. Задайте полный путь к XML-файлу конфигурации Exdi.
Эта проблема может быть вызвана следующими причинами:
- Переменная среды EXDI_GDBSRV_XML_CONFIG_FILE не задана. В некоторых ситуациях ExdiGDbSrv.dll продолжить работу, если нажать кнопку "ОК", но windbg.exe завершится сбоем запросов к системным регистрам (например, через функции rdmsr/wrmsr).
См. также
Настройка отладки режима ядра QEMU с помощью EXDI
Автоматическая настройка отладки сетевого ядра KDNET