Aracılığıyla paylaş


EXDI Kullanarak QEMU Kernel-Mode Hata Ayıklama Kurulumu

Bu konuda, Windows hata ayıklayıcısı ile EXDI kullanarak QEMU Kernel-Mode Hata Ayıklama'nın nasıl ayarlanacağı açıklanmaktadır.

EXDI bağlantılarını yapılandırma ve sorunlarını giderme hakkında genel bilgi için bkz. EXDI Hata Ayıklayıcı Aktarımını Yapılandırma.

Sanallaştırma ve makine öykünme yazılımı QEMU kullanarak, Linux gibi konak olarak hizmet veren diğer işletim sistemlerine bağlanmak mümkündür. QEMU'nun kendisi x64 ve Arm64 gibi çok sayıda mimari üzerinde çalışabilir. ExdiGdb hata ayıklama sunucusu diğer işlemcileri de destekler, örneğin x64 üzerinde çalışan QEMU'da hata ayıklamak ve Arm64'e öykünmek için WinDbg kullanmak mümkündür. EXDI'nin kullanılması, işletim sistemi yüklenmeden önce bile vm'nin önyükleme işleminin erken aşamalarında HW hata ayıklamasına da olanak tanır.

Uyarı

EXDI, belirli ortamlar için gelişmiş, özelleştirilmiş bir hata ayıklama biçimidir. Standart bir KDNET bağlantısı kullanmak daha kolaydır ve önerilir. Ağ hata ayıklamasını otomatik olarak ayarlamak için bkz. KDNET Ağ Çekirdeği Hata Ayıklamayı Otomatik Olarak Ayarlama.

EXDI COM Sunucusu

EXDI, donanım hata ayıklayıcıları (örneğin JTAG tabanlı veya GdbServer tabanlı) için destek ekleyerek WinDbg'nin genişletilmesine olanak tanıyan bir arabirimdir. Aşağıdaki diyagramda EXDI-GdbServer rolü gösterilmektedir.

WinDbg-DbgEng en üstte, EXDI arabiriminde ve GDB sunucusuyla iletişimde olan bir EXDI COM sunucusuyla EXDI-GdbServer rolünü gösteren yığın diyagramı.

Önemli

EXDI, KDNET protokolünü kullanmadığından, bağlı hata ayıklayıcı bilgisayarda nelerin çalıştığı hakkında önemli ölçüde daha az bilgiye sahiptir ve birçok komut farklı çalışır veya hiç çalışmayabilir. Hata ayıklanan kodun özel simgelerine erişim, hata ayıklayıcının hedef sistemler kod yürütmesini daha iyi anlamasına yardımcı olabilir. Daha fazla bilgi için bkz. Genel ve Özel Simgeler.

QEMU'da Windows Görüntüsüne hata ayıklayıcı bağlantısı kurma

Bu adımlar, GDB sunucusunu Windows üzerinde de çalışan bir Windbg istemcisine (EXDI COM sunucusunu kullanan) gösteren bir Windows x64 Sanal Makinesine nasıl ekleyebileceğinizi açıklar. WinDbg ExdiGdbSrv.dll (GDB sunucu istemcisi) ile QEMU GDB sunucusu arasında bir GdbServer RSP oturumu kullanılır.

  1. QEMU'u Windows'a indirin ve yükleyin.
  2. Hata ayıklama için gerekli ağ ve BIOS/UEFI ayarlarıyla başlatacak bir hedef QEMU sanal Windows görüntüsü yapılandırın.
  3. Başlatma betiği kullanarak QEMU ortamını başlatın.
  4. QEMU'da GdbServer'ı başlatın.
  5. Ağ bağlantısını denetleyin ve hedef görüntü IP adresini bulun ve kaydedin. (LocalHost'un ANA BILGISAYAR IP'sinin varsayılan adresi ve 1234 numaralı bağlantı noktası).
  6. Konak sistemine Windows hata ayıklama araçlarını indirin ve yükleyin.
  7. EXDI sunucusuna bağlanmak için komut satırını veya kullanıcı arabirimini kullanarak WinDbg'yi başlatın.
  8. Hedef QEMU Windows görüntüsünde hata ayıklamak için WinDbg kullanın.

QEMU açık kaynak makine öykünücüsü

QEMU, dinamik çeviriye neden olan genel ve açık kaynak makine öykünücüsü ve sanallaştırıcıdır. QEMU bir makine öykünücüsü olarak kullanıldığında, bir işlemci (Arm64 gibi) için üretilen işletim sistemi ve programları farklı bir makinede (x64 bilgisayar) çalıştırabilir. Ayrıca farklı işletim sistemleri (Windows/Linux/Mac) için sanal makine görüntülerini çalıştırabilir/barındırabilir.

QEMU, sanallaştırma için CPU uzantılarını (HVM) kullanmak üzere KVM gibi diğer hiper yöneticilerle çalışabilir. QEMU sanallaştırıcı olarak kullanıldığında QEMU, konuk kodunu doğrudan konak CPU'sunun üzerinde yürüterek neredeyse yerel performanslar elde eder. QEMU, CPU ve MMU öykünmesini gerçek donanıma boşaltmak için işletim sistemi hiper yöneticisi özelliklerinden yararlanabilir.

QEMU'u İndirme ve Yükleme

Bu kılavuzda, Windows x64 için QEMU, Windows hata ayıklayıcının da üzerinde çalıştığı bir x64 bilgisayara yüklenecektir.

QEMU indirme sayfasından QEMU'yi indirin: https://www.qemu.org/download/

QEMU yükleme hakkında bilgi için QEMU belgelerine bakın: https://www.qemu.org/documentation/

Hedef Sanal Disk Yapılandırma

Hata ayıklamak istediğiniz yazılımı içeren bir sanal disk görüntüsü bulun veya oluşturun.

Bu örnekte, bir Windows x64 VHDX sanal makine disk görüntüsü kullanılacaktır. Windows sanal makine görüntüleri hakkında daha fazla bilgi edinmek için bkz. Windows 10'da Hyper-V ile Sanal Makine Oluşturma.

VirtIO sürücülerini Windows Görüntüsüne ekleme

Ağ işlevselliğine ve makul depolama cihazı performansına izin vermek için VirtIO sürücülerini Windows sanal makine disk görüntüsüne ekleyin veya yükleyin. VirtIO sürücülerine buradan ulaşabilirsiniz: https://github.com/virtio-win/kvm-guest-drivers-windows

VirtIO, sanal makinelerin blok cihazları, ağ bağdaştırıcıları ve konsollar gibi soyut donanımlara erişmesini sağlayan standartlaştırılmış bir arabirimdir. VirtIO, QEMU gibi sanallaştırılmış bir ortamda donanım cihazlarına yönelik bir soyutlama katmanı görevi görür.

VirtIO sürücüsünü Windows görüntüsüne eklemek için aşağıdaki adımları izleyin:

  1. Bir klasördeki VirtIo sürücülerini ayıklayın, örneğin C:\VirtIo_Drivers.
  2. Dosya Gezgini'nde VHDX'e çift tıklayarak Windows x64 Sanal makinesini içeren VHDX'i bağlayın (diskpart'ı da kullanabilirsiniz). Windows VHDX'i belirli bir harf kullanarak bağlar, örneğin "L:"
  3. Dism kullanarak sürücüyü bağlı görüntüye ekleyin: dism /image:L: /Add-Driver /driver:C:\VirtIo_Drivers DISM hakkında daha fazla bilgi için bkz. DISM'ye Genel Bakış.
  4. İşlem tamamlandığında görüntüyü çıkararak VHDX'i QEMU'ya dönüştürmeye devam edebilirsiniz.

VHDX'i QEMU'ya dönüştürme

Bu adım gerekli değildir, ancak VHDX yerine yerel bir QEMU QCOW görüntüsü kullanılırken daha iyi performans elde edildiğinden önerilir.

vhdx'i dönüştürmek için aşağıdaki qemu-img.exe komutunu kullanın. Bu yardımcı program, QEMU'yı yüklediğiniz yerde bulunur, örneğin C:\Program Files\qemu.

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

UEFI Donanım Yazılımını İndir

En iyi sonuçları elde etmek için UEFI üretici yazılımı dosyasını (OVMF.fd) indirin veya derleyin. QEMU'nun varsayılan olarak eski BIOS sistemlerini taklit etmesi nedeniyle üretici yazılımı gereklidir.

UEFI Üretici Yazılımı için kaynaklardan biri Open Clear Linux projesidir: https://clearlinux.org/

Örnek UEFI OVMF.fd dosyası burada bulunabilir: https://github.com/clearlinux/common/tree/master/OVMF.fd

'de C:\Program Files\qemu\Firmwareindirilen dosyanın içeriğini ayıklayın.

Intel AMD64 haricindeki platformlar için firmware’ı EDK2'den derlemeniz gerekir. Daha fazla bilgi için bkz. https://github.com/tianocore/tianocore.github.io/wiki/How-to-build-OVMF.

QEMU Başlatma Betiğini Yapılandırma

Yapılandırma dosyanızı QEMU'da oluşturun. Örneğin, QEMU kök dizini altında bir StartQEMUx64Windows.bat dosya oluşturun. Aşağıdaki örnek dosyaya bakın.

QEMU Başlatma Betiğini kullanarak QEMU'yi başlatın

QEMU'yu başlatmak için QEMU başlatma betiğini çalıştırın.

c:\Program Files\qemu\StartQEMUx64Windows.bat

Bir güvenlik duvarı savunucusu istemi görüntülenirse, ana bilgisayar hata ayıklayıcı makinesi için Windows güvenlik duvarı üzerinden Windbg'yi etkinleştirmek üzere uygulamaya her tür ağ için tüm hakları verin.

Üç seçeneğin de işaretli olduğu Windows Defender Güvenlik Duvarı iletişim kutusu.

Windows Sanal Makinesi QEMU ortamında başlatıldıktan sonra QEMU kullanıcı arabirimi görüntülenir.

Görünüm menüsü seçeneklerini görüntüleyen QEMU'nun ekran görüntüsü.

QEMU monitör konsoluna gitmek için CTRL+ALT+ sayı tuş bileşimini kullanın. Bu monitör, View-compatmonitor> kullanılarak da kullanılabilir.

QEMU'da ön uç GDB sunucusunu başlatmak için yazın gdbserver .

QEMU, Waiting for gdb connection on device ‘tcp::1234’ şeklinde görüntülenmelidir

CTRL+ALT+1 tuş bileşimini kullanarak ana pencereye dönün.

İpucu: GDB konsol penceresi, öykünmeyi hızlı bir şekilde yeniden başlatmak için system_reset komutunu destekler. GDB konsol komutlarının listesi için yazın help .

QEMU x64 Windows VM başlatma betiği örneği

Aşağıda AMD64 Sanal Makineleri için kullanılabilecek örnek bir QEMU yapılandırma betiği verilmiştir. DISK ve CDROM dosyalarını işaret eden bağlantıları bilgisayarınızdaki konumlarla değiştirin.

    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%

Ağ bağlantısı

localhost

GDB sunucusu düzgün şekilde başlatıldıysa, GDB sunucusunun dinlediği bağlantı noktası numarasını görürsünüz ve konak hata ayıklayıcısı IP:Port çiftini ayarlamak için bu bağlantı noktasını kullanmanız gerekir.

Konak hata ayıklayıcınız QEMU konuk barındıran makinede bulunuyorsa, IP:Bağlantı noktası çiftinde Localhost tanımlayıcısı kullanılır. Bu örnekte, sunucu ve konak hata ayıklayıcısı aynı bilgisayarda olduğunda LocalHost:1234 kullanılacaktır.

Uzaktaki Sunucu

Uzak bir bilgisayarda çalışıyorsanız, Windows IP adresini bulun (hata ayıklayıcısı ana bilgisayar oturumu QEMU VM ile aynı Windows makinesinde bulunmayacaksa).

Hedef QEMU IP'si <address>:<port number> EXDI kullanıcı arabiriminde yapılandırılır.

Ağ ve bağlantı durumu hakkındaki bilgileri görüntülemek için QEMU konsolunda (compatmonitor0) aşağıdaki komutlar yayımlanabilir.

info network
info usernet

QEMU ağı hakkında ek bilgi için bkz. https://wiki.qemu.org/Documentation/Networking

Konak sistemine Windows hata ayıklama araçlarını indirme ve yükleme

Konak sistemine Windows Hata Ayıklama Araçları'nı yükleyin. Hata ayıklayıcı araçlarını indirme ve yükleme hakkında bilgi için bkz. Windowsiçin Hata Ayıklama Araçları .

Konak sisteminde WinDbg'yi başlatma

Burada açıklanan senaryoda, bağlanmak için EXDI kullanıcı arabiriminde aşağıdaki seçenekleri ayarlayın.

Hedef türü - QEMU

Hedef mimari - x64

Hedef İşletim Sistemi - Windows

Görüntü tarama buluşsal boyutu - 0xFFE - NT

Gdb sunucusu ve bağlantı noktası - LocalHost:1234

Bağlantılarda kesme - evet

IP ve bağlantı noktası adresi de dahil olmak üzere bağlantı seçeneklerinin gösterildiği Windbg EXDI çekirdek bağlantısı kullanıcı arabirimi.

EXDI kullanıcı arabiriminin kullanılması önerilse de, burada gösterilene benzer komut satırı seçeneğini kullanarak WinDbg'yi başlatmak da mümkündür.

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

Komut satırı kullanılırken, IP adresi ve bağlantı noktası exdiConfigData.xml dosyası kullanılarak yapılandırılır. Daha fazla bilgi için bkz. EXDI XML Yapılandırma dosyaları.

Daha fazla çıktıyı görüntülemek için -v: ayrıntılı oturum kullanılabilir. WinDbg seçenekleri hakkında genel bilgi için bkz. WinDbg Command-Line Seçenekleri.

Hata ayıklayıcının QEMU GdbServer'ı başlatması ve bu sunucuya bağlanması gerekir.

Pencere başlığında EXDI CLSID'yi görüntüleyen ana WinDbg oturumu.

Hata ayıklayıcı, EXDI aktarım başlatmasının başarılı olduğunu gösterecektir.

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 konsol paketleri penceresi, *"Gelişmiş seçenekler altında iletişim paketi günlüğünü göster seçeneği açık olarak ayarlandıysa, EXDI bağlantısının durumuyla ilgili bilgileri de görüntüleyebilir. Daha fazla bilgi için EXDI Hata Ayıklayıcı Aktarımını Yapılandırma makalesindeki sorun giderme bilgilerine bakın.

Hedef QEMU Windows görüntüsünde hata ayıklamak için WinDbg kullanma

dbgeng.dll, kesme komutunun oluştuğu sırada NT temel yük adresinin konumunu bulmak için buluşsal bir algoritma kullanır. Özel simgeler kullanılamıyorsa bu işlem başarısız olur.

Bu, birçok bağlantı dizisi altında kesintinin beklendiği gibi çalışmayabileceği anlamına gelir. Koda manuel olarak müdahale ederseniz, bu, Windows'un o anda yürütmekte olduğu rastgele bir konum olacaktır. Hedef kodun simgeleri mevcut olmayabilir, bu nedenle simgeleri kullanarak kesme noktaları ayarlamak zor olabilir.

Kullanılabilir hata ayıklayıcı bellek erişim komutları

Doğrudan belleğe erişen aşağıdaki komutlar gibi çalışacaktır.

k, kb, kc, kd, kp, kP, kv (Görüntü Yığını Geri çekme)

r (Yazmaçlar)

d, da, db, dc, dd, dD, df, dp, dq, du, dw (Monitör Belleği)

u (Unassemble)

Ayrıca kodda adım adım ilerleyebilirsiniz.

p (Adım)

Hata ayıklamak istediğiniz kodu bulmaya çalışmak için kullanılabilecek komutlar da vardır.

s (Arama Belleği)

.imgscan (Resim Üst Bilgilerini Bul)

Imgscan, geleneksel KDNET tabanlı çekirdek hata ayıklamasından farklı olarak, sembollere göre kesme noktaları ayarlama olanağı olmadığından, EDXI hata ayıklamada yardımcı olabilir. İstenen hedef görüntüyü bulmak, bellek erişim kesme noktası ayarlamak için konumunu kullanmayı kolaylaştırabilir.

.exdicmd (EXDI Komutu)

.exdicmd, etkin EXDI hata ayıklama bağlantısını kullanarak hedef sisteme bir EXDI komutu gönderir. Daha fazla bilgi için bkz . .exdicmd (EXDI Komutu).

Sorun giderme

EXDI Hata Ayıklayıcı Aktarımını Yapılandırma makalesindeki sorun giderme bilgilerine bakın.

Ayrıca bkz.

EXDI Hata Ayıklayıcısı Aktarımını Yapılandırma

EXDI XML Yapılandırma dosyaları

.exdicmd (EXDI Komutu)

Otomatik olarak KDNET Ağ Çekirdeği Hata Ayıklamasını Ayarlama

KDNET Ağ Çekirdeği Hata Ayıklama Ayarlarını Elle Yapılandırma