Настройка отладки режима ядра 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 не использует протокол KDNET, подключенный отладчик имеет значительно меньше сведений о том, что выполняется на компьютере, и многие команды будут работать по-разному или не работать вообще. Доступ к частным символам для отлаживаемого кода может помочь отладчику лучше понять выполнение кода целевых систем. Дополнительные сведения см. в разделе "Открытые и частные символы".
Настройка подключения отладчика к образу Windows в QEMU
В этих шагах описывается, как подключиться к виртуальной машине Windows x64, предоставляющей сервер GDB клиенту Windbg (который использует COM-сервер EXDI), который также работает в Windows. Используется сеанс RSP GdbServer между ExdiGdbSrv.dll WinDbg (клиент сервера GDB) и сервером GDB QEMU.
- Скачайте и установите QEMU в Windows.
- Настройте целевой образ виртуального Windows QEMU для запуска с необходимыми параметрами сети и BIOS/UEFI для отладки.
- Запустите среду QEMU с помощью скрипта запуска.
- Запустите GdbServer в QEMU.
- Проверьте сетевое подключение и найдите и запишите IP-адрес целевого образа. (IP-адрес УЗЛА по умолчанию localHost и порт 1234).
- Скачайте и установите средства отладки Windows в хост-системе.
- Запустите WinDbg с помощью командной строки или пользовательского интерфейса для подключения к серверу EXDI.
- Используйте 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, выполните следующие действия:
- Извлеките драйверы VirtIo в папке, например
C:\VirtIo_Drivers
. - Подключите VHDX, содержащую виртуальную машину Windows x64, дважды щелкнув VHDX в проводник (можно также использовать диск). Windows будет подключать VHDX с помощью определенной буквы, например "L:"
- Внедрение драйвера в подключенное изображение с помощью Dism:
dism /image:L: /Add-Driver /driver:C:\VirtIo_Drivers
дополнительные сведения о DISM см. в разделе "Обзор DISM". - По завершении процесса можно отключить изображение и перейти к преобразованию 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.
Используйте сочетание клавиш 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
Разрыв подключений — да
Хотя рекомендуется использовать пользовательский интерфейс 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.
Отладчик отобразит успешную инициализацию транспорта 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)
d, da, db, dc, dd, dD, df, dp, dq, du, dw (display Memory)
И вы можете выполнить шаги по коду.
Существуют также команды, которые можно использовать для поиска кода, который требуется выполнить отладку.
.imgscan (поиск заголовков изображений)
Imgscan может быть полезным при отладке EDXI, так как в отличие от традиционной отладки ядра на основе KDNET, установка точек останова на основе символов может быть недоступна. Поиск требуемого целевого образа может упростить использование его расположения для задания точки останова доступа к памяти.
.exdicmd (команда EXDI)
Exdicmd отправляет команду EXDI в целевую систему с помощью активного подключения отладки EXDI. Дополнительные сведения см. в разделе .exdicmd (команда EXDI).
Устранение неполадок
Сведения об устранении неполадок см. в разделе "Настройка транспорта отладчика EXDI".
См. также
Настройка транспорта отладчика EXDI