Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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.
Ö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.
- QEMU'u Windows'a indirin ve yükleyin.
- 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.
- Başlatma betiği kullanarak QEMU ortamını başlatın.
- QEMU'da GdbServer'ı başlatın.
- 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ı).
- Konak sistemine Windows hata ayıklama araçlarını indirin ve yükleyin.
- EXDI sunucusuna bağlanmak için komut satırını veya kullanıcı arabirimini kullanarak WinDbg'yi başlatın.
- 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:
- Bir klasördeki VirtIo sürücülerini ayıklayın, örneğin
C:\VirtIo_Drivers. - 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:"
- Dism kullanarak sürücüyü bağlı görüntüye ekleyin:
dism /image:L: /Add-Driver /driver:C:\VirtIo_DriversDISM hakkında daha fazla bilgi için bkz. DISM'ye Genel Bakış. - İş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.
Windows Sanal Makinesi QEMU ortamında başlatıldıktan sonra QEMU kullanıcı arabirimi görüntülenir.
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
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.
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)
d, da, db, dc, dd, dD, df, dp, dq, du, dw (Monitör Belleği)
Ayrıca kodda adım adım ilerleyebilirsiniz.
Hata ayıklamak istediğiniz kodu bulmaya çalışmak için kullanılabilecek komutlar da vardır.
.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ı
Otomatik olarak KDNET Ağ Çekirdeği Hata Ayıklamasını Ayarlama
KDNET Ağ Çekirdeği Hata Ayıklama Ayarlarını Elle Yapılandırma