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


Настройка отладки режима ядра QEMU с помощью EXDI

В этом разделе описывается настройка отладки режима ядра QEMU с помощью EXDI с отладчиком Windows.

Общие сведения о настройке и устранении неполадок подключений EXDI см. в разделе "Настройка транспорта отладчика EXDI".

Используя QEMU, программное обеспечение виртуализации и эмуляции машин, можно подключиться к другим операционным системам, обслуживающимся в качестве узла, например Linux. QEMU может выполняться на многочисленных архитектурах, таких как x64 и Arm64. Сервер отладки ExdiGdb также поддерживает другие процессоры, например, можно использовать WinDbg для отладки QEMU на x64, эмулируя Arm64. Использование EXDI также позволяет виртуальной машине выполнять отладку HW в начале процесса загрузки, даже до загрузки ОС.

Примечание.

EXDI — это расширенная специализированная форма отладки для определенных сред. Использование стандартного подключения KDNET проще настроить и рекомендуется. Чтобы настроить автоматическую отладку сети, см. раздел "Настройка автоматической отладки сетевого ядра KDNET".

COM-сервер EXDI

EXDI — это интерфейс, который позволяет расширить WinDbg, добавив поддержку аппаратных отладчиков (например, на основе JTAG или GdbServer). На приведенной ниже схеме показана роль EXDI-GdbServer.

Схема стека, показывающая роль EXDI-GdbServer с WinDbg-DbgEng сверху, интерфейсОМ EXDI и сервером EXDI COM, взаимодействующим с сервером GDB.

Внимание

Так как EXDI не использует протокол KDNET, подключенный отладчик имеет значительно меньше сведений о том, что выполняется на компьютере, и многие команды будут работать по-разному или не работать вообще. Доступ к частным символам для отлаживаемого кода может помочь отладчику лучше понять выполнение кода целевых систем. Дополнительные сведения см. в разделе "Открытые и частные символы".

Настройка подключения отладчика к образу Windows в QEMU

В этих шагах описывается, как подключиться к виртуальной машине Windows x64, предоставляющей сервер GDB клиенту Windbg (который использует COM-сервер EXDI), который также работает в Windows. Используется сеанс RSP GdbServer между ExdiGdbSrv.dll WinDbg (клиент сервера GDB) и сервером GDB QEMU.

  1. Скачайте и установите QEMU в Windows.
  2. Настройте целевой образ виртуального Windows QEMU для запуска с необходимыми параметрами сети и BIOS/UEFI для отладки.
  3. Запустите среду QEMU с помощью скрипта запуска.
  4. Запустите GdbServer в QEMU.
  5. Проверьте сетевое подключение и найдите и запишите IP-адрес целевого образа. (IP-адрес УЗЛА по умолчанию localHost и порт 1234).
  6. Скачайте и установите средства отладки Windows в хост-системе.
  7. Запустите WinDbg с помощью командной строки или пользовательского интерфейса для подключения к серверу EXDI.
  8. Используйте WinDbg для отладки целевого образа Windows QEMU.

Эмулятор компьютера с открытым кодом QEMU

QEMU — это универсальный и виртуальный эмулятор с открытым исходным кодом, который приводит к динамическому переводу. Если QEMU используется в качестве эмулятора компьютера , он может запускать ос и программы, сделанные для одного процессора (например, Arm64) на другом компьютере (x64 PC). Он также может запускать и размещать образы виртуальных машин для разных ОС (Windows/Linux/Mac).

QEMU может работать с другими гипервизорами, такими как KVM, чтобы использовать расширения ЦП (HVM) для виртуализации. При использовании QEMU в качестве виртуализатора QEMU достигает почти собственных производительности путем выполнения гостевого кода непосредственно на ЦП узла. QEMU может воспользоваться функциями гипервизора ОС для разгрузки ЦП и эмуляции MMU на реальное оборудование.

Скачивание и установка QEMU

В этом пошаговом руководстве QEMU для Windows x64 будет установлен на компьютере x64, где отладчик Windows также будет работать.

Скачайте QEMU на странице скачивания QEMU: https://www.qemu.org/download/

Дополнительные сведения об установке QEMU см. в документации по QEMU. https://www.qemu.org/documentation/

Настройка целевого виртуального диска

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

В этом примере будет использоваться образ диска виртуальной машины VHDX для Windows x64. Дополнительные сведения о образах виртуальных машин Windows см. в статье "Создание виртуальной машины с помощью Hyper-V в Windows 10".

Внедрение драйверов VirtIO в образ Windows

Чтобы обеспечить функциональность сети и разумную производительность устройства хранения, вставьте или установите драйверы VirtIO в образ диска виртуальной машины Windows. Драйверы VirtIO доступны здесь: https://github.com/virtio-win/kvm-guest-drivers-windows

VirtIO — это стандартизированный интерфейс, который позволяет виртуальным машинам получать доступ к абстрактном оборудованию, например блокировать устройства, сетевые адаптеры и консоли. VirtIO служит слоем абстракции для аппаратных устройств в виртуализированной среде, например QEMU.

Чтобы внедрить драйвер VirtIO в образ Windows, выполните следующие действия:

  1. Извлеките драйверы VirtIo в папке, например C:\VirtIo_Drivers.
  2. Подключите VHDX, содержащую виртуальную машину Windows x64, дважды щелкнув VHDX в проводник (можно также использовать диск). Windows будет подключать VHDX с помощью определенной буквы, например "L:"
  3. Внедрение драйвера в подключенное изображение с помощью Dism: dism /image:L: /Add-Driver /driver:C:\VirtIo_Drivers дополнительные сведения о DISM см. в разделе "Обзор DISM".
  4. По завершении процесса можно отключить изображение и перейти к преобразованию VHDX в QEMU.

Преобразование VHDX в QEMU

Этот шаг не является обязательным, но рекомендуется, так как при использовании собственного образа QEMU QCOW вместо VHDX рекомендуется повысить производительность.

Чтобы преобразовать vhdx, используйте следующую команду qemu-img.exe. Эта программа находится там, где установлен QEMU, например C:\Program Files\qemu.

C:\Program Files\qemu> qemu-img convert -c -p -O qcow2 MyVHDXFile.vhdx MyQEMUFile.qcow2 

Скачивание встроенного ПО UEFI

Для получения наилучших результатов скачайте или скомпилируйте файл встроенного ПО UEFI (OVMF.fd). Встроенное ПО необходимо, так как в противном случае QEMU эмулирует старые системы BIOS.

Одним из источников встроенного ПО UEFI является проект Open Clear Linux: https://clearlinux.org/

Пример файла UEFI OVMF.fd доступен здесь: https://github.com/clearlinux/common/tree/master/OVMF.fd

Извлеките содержимое скачаированного файла в C:\Program Files\qemu\Firmware.

Для платформ, отличных от Intel AMD64, следует скомпилировать встроенное ПО из EDK2. Дополнительные сведения см. в разделе https://github.com/tianocore/tianocore.github.io/wiki/How-to-build-OVMF.

Настройка скрипта запуска QEMU

Создайте файл конфигурации в QEMU. Например, создайте StartQEMUx64Windows.bat файл в корневом каталоге QEMU. См. пример файла ниже.

Использование скрипта запуска QEMU для запуска QEMU

Выполните скрипт запуска QEMU, чтобы запустить QEMU.

c:\Program Files\qemu\StartQEMUx64Windows.bat

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

Диалоговое окно

После запуска виртуальной машины Windows в среде QEMU будет отображаться пользовательский интерфейс QEMU.

Снимок экрана: QEMU с параметрами меню представления.

Используйте сочетание клавиш CTRL+ALT+ для перехода в консоль монитора QEMU. Этот монитор также доступен с помощью view-compatitor>.

Введите gdbserver , чтобы запустить внешний сервер GDB на QEMU.

Должен отображаться QEMU Waiting for gdb connection on device ‘tcp::1234’

Вернитесь в главное окно с помощью сочетания клавиш CTRL+ALT+1.

Совет. Окно консоли GDB поддерживает system_reset команду, чтобы быстро перезапустить эмуляцию. Введите help список команд консоли GDB.

Пример скрипта запуска виртуальной машины Windows xEMU x64

Ниже приведен пример сценария конфигурации QEMU, который можно использовать для Виртуальные машины AMD64. Замените ссылки, указывающие на файлы DISK и CDROM в расположения на компьютере.

    REM
    REM  This script is used to run a Windows x64 VM on QEMU that is hosted by a Windows x64 host system
    REM  The Host system is a PC with Intel(R) Xeon(R) CPU.
    REM
    set EXECUTABLE=qemu-system-x86_64
    set MACHINE=-m 6G -smp 4

    REM No acceleration
    REM generic cpu emulation.
    REM to find out which CPU types are supported by the QEMU version on your system, then run:
    REM	 qemu-system-x86_64.exe -cpu help
    REM the see if your host system CPU is listed
    REM

    set CPU=-machine q35 

    REM Enables x64 UEFI-BIOS that will be used by QEMU :
    set BIOS=-bios "C:\Program Files\qemu\Firmware\OVMF.fd"

    REM  Use regular GFX simulation
    set GFX=-device ramfb -device VGA 
    set USB_CTRL=-device usb-ehci,id=usbctrl
    set KEYB_MOUSE=-device usb-kbd -device usb-tablet

    REM # The following line enable the full-speed HD controller (requires separate driver)
    REM # Following line uses the AHCI controller for the Virtual Hard Disk:
    set DRIVE0=-device ahci,id=ahci -device ide-hd,drive=disk,bus=ahci.0

    REM
    REM This will set the Windows VM x64 disk image that will be launched by QEMU
    REM The disk image is in the qcow2 format accepted by QEMU.
    REM You get the .qcow2 image, once you get the VHDX Windows VM x64 image 
    REM and apply the script to inject the virtio x64 drivers and then run the 
    REM the QEMU tool to convert the .VHDX image to .qcow2 format
    REM 	i.e. 
    REM	qemu-img convert -c -p -O qcow2 Windows_VM_VHDX_with_injected_drivers_file.vhdx file.qcow2
    REM file : points to the specified qcow2 image path.
    REM
    set DISK0=-drive id=disk,file="C:\Program Files\qemu\MyQEMUFile.qcow2",if=none

    REM
    REM for kdnet on, then best option:
    REM   NETWORK0="-netdev user,id=net0,hostfwd=tcp::53389-:3389,hostfwd=tcp::50001-:50001 -device virtio-net,netdev=net0,disable-legacy=on"
    REM
    REM Create a mapping for the RDP service from port 3389 to 3589.
    REM
    set NETHOST=-netdev user,id=net0,hostfwd=tcp::3589-:3389
    set NETGUEST=-device e1000,netdev=net0

    REM # The following line should enable the Daemon (instead of interactive)
    set DAEMON=-daemonize"
    %EXECUTABLE% %MACHINE% %CPU% %BIOS% %GFX% %USB_CTRL% %DRIVE0% %DISK0% %NETHOST% %NETGUEST%

Сетевое соединение

Локальный узел

Если сервер GDB запущен правильно, вы увидите номер порта, в котором будет прослушивать сервер GDB, и вам потребуется использовать этот порт для настройки пары отладчика IP:Port узла.

Если отладчик узла находится на том же компьютере, на котором размещается гость QEMU, идентификатор Localhost будет использоваться в паре IP:Port. В этом примере будет использоваться отладчик сервера и узла на одном компьютере LocalHost:1234 .

Удаленный узел

При работе с удаленным компьютером найдите IP-адрес Windows (если сеанс узла отладчика не будет находиться на том же компьютере Windows, что и виртуальная машина QEMU).

Целевой IP-адрес <address>QEMU:<port number> будет настроен в пользовательском интерфейсе EXDI.

Следующие команды можно вывести на консоли QEMU (compatmonitor0), чтобы отобразить сведения о состоянии сети и подключения.

info network
info usernet

Дополнительные сведения о сети QEMU см. в разделе https://wiki.qemu.org/Documentation/Networking

Скачивание и установка средств отладки Windows на хост-системе

Установите средства отладки Windows в хост-системе. Сведения о скачивании и установке средств отладчика см. в разделе "Средства отладки" для Windows.

Запуск WinDbg в системе узла

В описанном здесь сценарии задайте следующие параметры в пользовательском интерфейсе EXDI для подключения.

Тип целевого объекта — QEMU

Целевая архитектура — x64

Целевая ОС — Windows

Размер эвристического сканирования изображения — 0xFFE — NT

Сервер gdb и порт — LocalHost:1234

Разрыв подключений — да

Пользовательский интерфейс подключения ядра Windbg EXDI с параметрами подключения, включая IP-адрес и адрес порта.

Хотя рекомендуется использовать пользовательский интерфейс EXDI, можно также запустить WinDbg с помощью параметра командной строки, как показано здесь.

c:\Debuggers> windbg.exe -v -kx exdi:CLSID={29f9906e-9dbe-4d4b-b0fb-6acf7fb6d014},Kd=Guess,Inproc=ExdiGdbSrv.dll,DataBreaks=Exdi

При использовании командной строки IP-адрес и порт настраиваются с помощью файла exdiConfigData.xml. Дополнительные сведения см. в файлах конфигурации EXDI XML.

Для отображения дополнительных выходных данных можно использовать подробный сеанс -v: подробный сеанс. Общие сведения о параметрах WinDbg см. в разделе "Параметры командной строки WinDbg".

Отладчик должен запускать и подключаться к QEMU GdbServer.

Основной сеанс WinDbg, отображающий CLSID EXDI в заголовке окна.

Отладчик отобразит успешную инициализацию транспорта EXDI.

EXDI: DbgCoInitialize returned 0x00000001
EXDI: CoCreateInstance() returned 0x00000000
EXDI: QueryInterface(IExdiServer3) returned 0x00000000
Target command response: QEMU
exdiCmd: The function: 'ExdiDbgType' was completed.
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

Окно пакетов консоли EXDIGdbServer также может отображать сведения о состоянии подключения EXDI, если параметр *"Показать журнал пакетов связи в разделе "Дополнительные параметры". Дополнительные сведения см. в разделе об устранении неполадок при настройке транспорта отладчика EXDI.

Отладка целевого образа Windows QEMU с помощью WinDbg

Dbgeng.dll использует эвристические алгоритмы для поиска расположения базового адреса загрузки NT во время выполнения команды останова. Если закрытые символы недоступны, этот процесс завершится ошибкой.

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

Доступные команды доступа к памяти отладчика

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

k, kb, kc, kd, kp, kP, kv (Display Stack Backtrace)

r (Registers)

d, da, db, dc, dd, dD, df, dp, dq, du, dw (display Memory)

u (Unassemble)

И вы можете выполнить шаги по коду.

p (шаг)

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

s (память поиска)

.imgscan (поиск заголовков изображений)

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

.exdicmd (команда EXDI)

Exdicmd отправляет команду EXDI в целевую систему с помощью активного подключения отладки EXDI. Дополнительные сведения см. в разделе .exdicmd (команда EXDI).

Устранение неполадок

Сведения об устранении неполадок см. в разделе "Настройка транспорта отладчика EXDI".

См. также

Настройка транспорта отладчика EXDI

Файлы конфигурации EXDI XML

.exdicmd (команда EXDI)

Автоматическая настройка отладки сетевого ядра KDNET

Настройка отладки сетевого ядра KDNET вручную