Aracılığıyla paylaş


EXDI XML Yapılandırma dosyaları

Bu konuda, EXDI XML Yapılandırma dosyalarını kullanarak gelişmiş seçeneklerin nasıl yapılandırıldığı açıklanmaktadır. EXDI'yi yapılandırmak için WinDbg kullanıcı arabirimini kullanma hakkında genel bilgi için bkz. EXDI Hata Ayıklayıcı Aktarımını Yapılandırma. Yaygın ayarların çoğu, burada açıklanan EXDI XML Yapılandırma dosyalarını el ile düzenlemek için daha kolay bir yaklaşım olan kullanıcı arabiriminde kullanılabilir.

Genişletilmiş Hata Ayıklama Arabirimi (EXDI), yazılım hata ayıklayıcısı ile hata ayıklama hedefi arasındaki bir uyarlama katmanıdır. Windows için Hata Ayıklama Araçları, Windows sürüm 22000'den itibaren EXDI kullanılarak çekirdek hata ayıklamasını destekler.

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 yapılandırma XML dosyalarını kullanarak gelişmiş seçenekleri yapılandırma

EXDI GDB COM sunucusu (ExdiGdbSrv.dll) tarafından kullanılan iki gerekli xml dosyası vardır.

  1. exdiConfigData.xml - Bu dosya, GDB sunucu istemcisinin HW hata ayıklayıcısı GDB sunucusu hedefiyle başarılı bir GDB oturumu oluşturması için gerekli olan ana yapılandırma verilerini içerir, böylece dosya konumu EXDI_GDBSRV_XML_CONFIG_FILE ortam değişkeni tarafından ayarlanmadıysa GDB sunucu istemcisi çalışmaz. Her xml etiketi, GDB sunucusu işlevselliğinin belirli bir kümesini yapılandırmaya olanak tanır. XML'de değiştirebileceğiniz özniteliklerin listesi ve örnek XML için aşağıya bakın.

  2. Systemregister.xml - Bu dosya, sistem yazmaçları ile yazmaçlara erişmek için kullanılan kod arasında bir eşleme içerir. Erişim kodu xml dosyasındaki GDB sunucusu tarafından sağlanmadığından ve hata ayıklayıcısı erişim kodu aracılığıyla her sistem kaydına eriştiğinden bu gereklidir. Dosya ortam değişkeni EXDI_SYSTEM_REGISTERS_MAP_XML_FILEaracılığıyla ayarlanmadıysa ExdiGdbSrv.dll çalışmaya devam eder, ancak hata ayıklayıcı rdmsr veya wrmsr komutları aracılığıyla herhangi bir sistem kaydına erişemez. Bu yazmaçların listesi GDB sunucusu donanım hata ayıklayıcısı tarafından desteklenmelidir (belirli bir sistem kayıt adı, sistem xml dosyasında gönderilen yazmaçlar listesinde bulunmalıdır).

EXDI kullanıcı arabirimi ve XML yapılandırma dosyaları

WinDbg'deki EXDI kullanıcı arabirimi, XML dosya parametrelerini kullanır ve IP:Port değeri gibi gerekli kullanıcı arabirimi parametrelerinde birleştirilir. Varsayılan XML dosyası parametrelerini değiştirmeniz gerekiyorsa, komut satırından parametresiyle PathToSrvCfgFiles=<path to the modified exdiconfigdata.xml file>WinDbgNext uygulamasını başlatın.

Hedef mimari

EXDI UI hedef mimarisi alan değerinin, hedefte çalışan Windows işletim sistemi ile yalnızca, Windows işletim sistemi hedef mimarisini açıklayan hedef açıklama XML dosyasını uygulamayan GDB sunucu saplamaları için eşleşmesi gerekir. Bu target.xml dosya bilgileri, GDB istemcisi ile GDB sunucu stub'u arasında GDB-RSP protokolü imzalanması sırasında GDB sunucu stub'u tarafından gönderilir.

Windbg-ExdiGdbSrv, kullanıcı EXDI kullanıcı arabiriminde yanlış bir hedef mimari alanı giriş değeri ayarlasa bile doğru hedef işletim sistemi mimarisini ayarlayabilir. target.xml dosyasını içeren GDB sunucularının el sıkışmasında sağlanan target.xml açıklama dosyasından hedef işletim sistemi mimarisi elde edilir ve yapılandırılır. Hedef mimariyi denetlemek için etkili makine .effmach hata ayıklayıcısı komutunu kullanın.

GDBServer Etiketleri ve öznitelikleri

Aşağıdaki tabloda, dosyada tanımlanan exdiConfigData.xml GDBServer etiketleri ve öznitelikleri açıklanmaktadır.

Parametre Açıklama
ExdiTargets Hangi spesifik GDB sunucusu hedef yapılandırmasının ExdiGgbSrv.dll tarafından kullanılacağı belirtilir, böylece GDB sunucusu ile bağlantı kurulmuş olur; çünkü exdiConfigData.xml dosyası şu anda ExdiGdbSrv.dll tarafından desteklenen tüm GDB sunucularını içermektedir (bu dosya, belirli bir GDB sunucusuyla ExdiGdbSrv.dll kullanılmadan önce muhakkak doldurulmalıdır).
CurrentTarget GDB sunucu hedefinin adını belirtir (örneğin, bu öznitelik değeri, exdiConfigData.xml dosyasının <ExdiTarget Name= içerdiği etiketlerden birinin ad değeriyle eşleşmelidir.
ExdiTarget bu, her GDB sunucusu hedef bileşeni tarafından eklenen tüm yapılandırma verilerinin başlangıç etiketidir.
İsim GDB sunucusunun adını belirtir (örneğin, QEMU, BMC-OpenOCD, Trace32, VMware).
agentNamePacket Bu, GDB sunucusu HW hata ayıklayıcısı tarafından tanındığı için GDB istemcisinin adıdır. Bu, GDB sunucusu HW hata ayıklayıcısı tarafından kendisini belirli GDB istemcileri için yapılandırmak üzere kullanılabilir (örn. Trace32 GDB sunucusu, windbg-GDB istemcisini tanımlamak için ExdiGdbSrv.dll "QMS.windbg" adı göndermesini gerektirir ve ardından özelleştirilmiş GDB bellek paketlerini yalnızca MS GDB sunucu istemcisi (exdiGdbSrv.dll) için desteklenir.
ExdiGdbServerConfigData ExdiGdbSrv.dll bileşeniyle ilgili yapılandırma parametrelerini belirtir.
UUID (evrensel benzersiz tanımlayıcı) ExdiGdbSrv.dll bileşeninin UUI'sini belirtir.
İletişim Paketlerini Göster Eğer 'evet' ise, RSP protokolü iletişim karakterlerini komut günlüğü penceresinde görüntüleyeceğiz. 'Hayır' ise yalnızca istek-yanıt çifti metnini görüntüleriz.
enableThrowExceptionOnMemoryErrors (Bellek Hatalarında İstisna Atmayı Etkinleştir) bu öznitelik, istemcinin özel durum oluşturup belleği okumayı durdurması gerekip gerekmediğini belirlemek için bir GDB hata yanıt paketi (E0x) olduğunda GDB sunucu istemcisi tarafından denetlenir.
qSupportedPacket Bu, GDB istemcisinin xml hedef açıklama dosyasından sonra GDB sunucusu HW hata ayıklayıcısı tarafından hangi xml kayıt mimari dosyasının gönderilmesi gerektiğini istemek üzere yapılandırılmasına olanak tanır (temel olarak, istemci GDB sunucusuna istemci tarafından desteklenen mimarileri bildirir, şu anda istemci x64 mimarisini destekler).
ExdiGdbServerTargetData GdbServer oturumunun hata ayıkladığı donanım hedefiyle ilgili parametreleri belirler.
hedef mimari Hedef donanım mimarisini içeren dize. Olası değerler: X86, X64, ARM, ARM64. Şu anda exdiGdbSrv.dll yalnızca X86 ve ARM'yi destekler.
hedefAilesi Hedef donanım ailesini içeren dize. Olası değerler: ProcessorFamilyX86, ProcessorFamilyX64, ProcessorFamilyARM, ProcessorFamilyARM64.
numberOfCores Hedef tarafından desteklenen işlemci çekirdeği sayısı. Bu parametre, çoklu Gdbserver oturumu (T32-GdbServer) kullandığımızda doğrulanır. Aşağıdaki 'MultiCoreGdbServerSessions' özniteliği 'evet' olarak ayarlanmalıdır.
EnableSseContext Bayrak 'evet' ise, 'g' durumundaki RSP paketi kayan nokta yazmaç değerlerini içerecektir. Bu parametre yalnızca Intel ailesi hedefleri için anlamlıdır.
heuristikTaramaboyutu Bu, hata ayıklayıcı motorunu, sezgisel hızlı algoritması ile tarama belleğini belirtilen boyuta düşürecek şekilde yapılandırır; öznitelik değeri belirtilmezse veya "0" ise, hata ayıklayıcı motoru hızlı sezgisel yöntemi kullanmaz ve belleğin tamamını PE DOS imzasını arayarak tarayan eski sezgisel algoritmaya geri döner. Yaygın tarama boyutu değerleri 0xfffe (NT için en iyi) veya 0xffe 'dır (NT öncesi Uygulamalar için).
hedefTanımlamaDosyası GDB sunucusunun her ayrı xml dosyasını göndermeden önce bir hedef açıklama üst bilgi dosyası gönderip göndermediğini belirtir. Bu alan boşsa, GDB sunucusu istemcisi xml mimarisi sistem yazmaçını (örneğin, mimari yazmaçlarını ayrı bir xml dosyasına göndermeyi desteklemeyen Trace32 GDBs sunucusu) istemez.
GdbServerConnectionParameters GdbServer oturum parametrelerini belirtir. Bu parametreler, ExdiGdbSrv.dll bileşeni ile GdbServer arasındaki RSP GdbServer oturumunu denetlemek için kullanılır.
MultiCoreGdbSunucuOturumları Bayrak 'evet' ise, çok çekirdekli GdbServer oturumumuz olur (T32-GdbServer Back-Endtarafından kullanılan oturum). 'Hayır' ise, GdbServer'ın yalnızca bir örneğiyle iletişim kurarız.
MaximumGdbServerPacketLength Bu, bir paket için desteklenen GdbServer uzunluğu üst sınırıdır.
MaksimumBağlantıDenemeleri Bu, en fazla bağlantı denemesi sayısıdır. GdbServer ile RSP bağlantısını kurmaya çalıştığında ExdiGdbSrv.dll tarafından kullanılır.
PaketGöndermeZamanAşımı Bu, RSP gönderme zaman aşımı süresidir.
Veri Paket Alma Zaman Aşımı Bu, RSP için alım zaman aşımıdır.
HostNameAndPort Bu, biçimindeki <hostname/ip address:Port number>bağlantı dizesidir. Birden fazla GdbServer bağlantı dizesi (T32 çok çekirdekli GdbServer oturumu gibi) olabilir. Bağlantı dizelerinin sayısı çekirdek sayısıyla eşleşmelidir.
ExdiGdbServerMemoryCommands Sistem kayıt değerlerini veya okuma/yazma erişim belleğini farklı özel durum CPU düzeylerinde almak için GDB bellek komutlarını vermenin çeşitli yollarını belirtir (örneğin, BMC-OpenOCD "aarch64 mrs nsec/sec <access code>" özelleştirilmiş komutu aracılığıyla CP15 yazmaçlarına erişim sağlar).
GdbÖzelBellekKomutu "evet" ise, GDB sunucusu özelleştirilmiş bellek komutlarını destekler (örneğin, sistem kaydı, bu Trace32 GDB sunucusu için ayarlanmalıdır).
Fiziksel Bellek "evet" ise, GDB sunucusu fiziksel belleği okumak için özelleştirilmiş komutları destekler (Trace32 GDB sunucusu için ayarlanır).
SupervisorMemory "evet" ise, GDB sunucusu gözetmen belleğini okumak için özelleştirilmiş komutları destekler (Trace32 GDB sunucusu için ayarlanır).
ÖzelBellekKaydı "evet" ise, GDB sunucusu sistem yazmaçlarını okumak için özelleştirilmiş komutları destekler (Trace32 GDB sunucusu için ayarlanır)
SystemRegistersGdbMonitor "evet" ise, GDB sunucusu GDB izleyici komutu aracılığıyla özelleştirilmiş komutları destekler (BMC Open-OCDiçin ayarlanır).
Sistem Kayıt Çözümleme "evet" ise, GDB istemcisi GDB izleyicisi komutunu göndermeden önce erişim kodunun kodunu çözmeyi kabul eder.
ExdiGdbServerRegisters Belirli mimari kayıt çekirdek kümesini belirtir.
Mimarlık Tanımlı yazmaç kümesinin CPU mimarisi.
FeatureNameDestekleniyor Bu, xml sistem kaydı açıklama dosyası tarafından sağlandığı şekilde sistem kayıt grubunun adıdır. GDB sunucusu tarafından gönderilen xml dosyasının parçası olan sistem kayıt xml grubunun tanımlanması gereklidir.
Sistem Kayitlari Başlat Bu, çekirdek yazmaç kümesinin parçası olarak bildirilen ilk sistem kaydını (düşük yazmaç numarası/sırası) tanımlamaktır (örneğin, X64'te, QEMU x64 sistem yazmaç kümesini ayrılmış xml hedef açıklama dosyası olarak raporlamaz, bu nedenle sistem kayıt defterleri çekirdek yazmaçların bir parçasıdır).
SystemRegistersEnd Bu, çekirdek yazmaç kümesinin parçası olarak bildirilen son sistem kaydını (yüksek yazmaç numarası/sırası) tanımlamaktır.
İsim Kaydedici adı.
Sipariş Bu, yazmaç dizisindeki dizini tanımlayan bir sayıdır. Bu sayı GDB istemcisi ve sunucu kümesi/sorgusu (p<number>”/”q<number>) yazmaç paketleri tarafından kullanılır.
Boyut Bu, byte cinsinden kaydedici boyutudur.

Örnek exdiConfigData.xml dosyası

<ExdiTargets CurrentTarget = "QEMU">
<!-- QEMU SW simulator GDB server configuration -->
    <ExdiTargets CurrentTarget="QEMU">
    <!--  QEMU SW simulator GDB server configuration  -->
    <ExdiTarget Name="QEMU">
    <ExdiGdbServerConfigData agentNamePacket="" uuid="72d4aeda-9723-4972-b89a-679ac79810ef" displayCommPackets="yes" debuggerSessionByCore="no" enableThrowExceptionOnMemoryErrors="yes" qSupportedPacket="qSupported:xmlRegisters=aarch64,i386">
    <ExdiGdbServerTargetData targetArchitecture="ARM64" targetFamily="ProcessorFamilyARM64" numberOfCores="1" EnableSseContext="no" heuristicScanSize="0xfffe" targetDescriptionFile="target.xml"/>
    <GdbServerConnectionParameters MultiCoreGdbServerSessions="no" MaximumGdbServerPacketLength="1024" MaximumConnectAttempts="3" SendPacketTimeout="100" ReceivePacketTimeout="3000">
    <Value HostNameAndPort="LocalHost:1234"/>
    </GdbServerConnectionParameters>
    <ExdiGdbServerMemoryCommands GdbSpecialMemoryCommand="no" PhysicalMemory="no" SupervisorMemory="no" HypervisorMemory="no" SpecialMemoryRegister="no" SystemRegistersGdbMonitor="no" SystemRegisterDecoding="no"> </ExdiGdbServerMemoryCommands>
        <ExdiGdbServerRegisters Architecture = "ARM64" FeatureNameSupported = "sys">
            <Entry Name ="X0"  Order = "0" Size = "8" />
            <Entry Name ="X1"  Order = "1" Size = "8" />
            <Entry Name ="X2"  Order = "2" Size = "8" />
            <Entry Name ="X3"  Order = "3" Size = "8" />
            <Entry Name ="X4"  Order = "4" Size = "8" />
            <Entry Name ="X5"  Order = "5" Size = "8" />
            <Entry Name ="X6"  Order = "6" Size = "8" />
            <Entry Name ="X7"  Order = "7" Size = "8" />
            <Entry Name ="X8"  Order = "8" Size = "8" />
            <Entry Name ="X9"  Order = "9" Size = "8" />
            <Entry Name ="X10" Order = "a"  Size = "8" />
            <Entry Name ="X11" Order = "b"  Size = "8" />
            <Entry Name ="X12" Order = "c"  Size = "8" />
            <Entry Name ="X13" Order = "d"  Size = "8" />
            <Entry Name ="X14" Order = "e"  Size = "8" />
            <Entry Name ="X15" Order = "f"  Size = "8" />
            <Entry Name ="X16" Order = "10" Size = "8" />
            <Entry Name ="X17" Order = "11" Size = "8" />
            <Entry Name ="X18" Order = "12" Size = "8" />
            <Entry Name ="X19" Order = "13" Size = "8" />
            <Entry Name ="X20" Order = "14" Size = "8" />
            <Entry Name ="X21" Order = "15" Size = "8" />
            <Entry Name ="X22" Order = "16" Size = "8" />
            <Entry Name ="X23" Order = "17" Size = "8" />
            <Entry Name ="X24" Order = "18" Size = "8" />
            <Entry Name ="X25" Order = "19" Size = "8" />
            <Entry Name ="X26" Order = "1a" Size = "8" />
            <Entry Name ="X27" Order = "1b" Size = "8" />
            <Entry Name ="X28" Order = "1c" Size = "8" />
            <Entry Name ="fp"  Order = "1d" Size = "8" />
            <Entry Name ="lr"  Order = "1e" Size = "8" />
            <Entry Name ="sp"  Order = "1f" Size = "8" />
            <Entry Name ="pc"  Order = "20" Size = "8" />
            <Entry Name ="cpsr" Order = "21" Size = "8" />
            <Entry Name ="V0" Order = "22" Size = "16" />
            <Entry Name ="V1" Order = "23" Size = "16" />
            <Entry Name ="V2" Order = "24" Size = "16" />
            <Entry Name ="V3" Order = "25" Size = "16" />
            <Entry Name ="V4" Order = "26" Size = "16" />
            <Entry Name ="V5" Order = "27" Size = "16" />
            <Entry Name ="V6" Order = "28" Size = "16" />
            <Entry Name ="V7" Order = "29" Size = "16" />
            <Entry Name ="V8" Order = "2a" Size = "16" />
            <Entry Name ="V9" Order = "2b" Size = "16" />
            <Entry Name ="V10" Order = "2c" Size = "16" />
            <Entry Name ="V11" Order = "2d" Size = "16" />
            <Entry Name ="V12" Order = "2e" Size = "16" />
            <Entry Name ="V13" Order = "2f" Size = "16" />
            <Entry Name ="V14" Order = "30" Size = "16" />
            <Entry Name ="V15" Order = "31" Size = "16" />
            <Entry Name ="V16" Order = "32" Size = "16" />
            <Entry Name ="V17" Order = "33" Size = "16" />
            <Entry Name ="V18" Order = "34" Size = "16" />
            <Entry Name ="V19" Order = "35" Size = "16" />
            <Entry Name ="V20" Order = "36" Size = "16" />
            <Entry Name ="V21" Order = "37" Size = "16" />
            <Entry Name ="V22" Order = "38" Size = "16" />
            <Entry Name ="V23" Order = "39" Size = "16" />
            <Entry Name ="V24" Order = "3a" Size = "16" />
            <Entry Name ="V25" Order = "3b" Size = "16" />
            <Entry Name ="V26" Order = "3c" Size = "16" />
            <Entry Name ="V27" Order = "3d" Size = "16" />
            <Entry Name ="V28" Order = "3e" Size = "16" />
            <Entry Name ="V29" Order = "3f" Size = "16" />
            <Entry Name ="V30" Order = "3f" Size = "16" />
            <Entry Name ="V31" Order = "3f" Size = "16" />
            <Entry Name ="fpsr" Order = "40" Size = "4" />
            <Entry Name ="fpcr" Order = "41" Size = "4" />
        </ExdiGdbServerRegisters>


        <!-- x64 GDB server core resgisters -->
        <ExdiGdbServerRegisters Architecture = "X64" FeatureNameSupported = "sys" SystemRegistersStart = "18" SystemRegistersEnd = "20" >
            <Entry Name ="rax" Order = "0" Size ="8" />
            <Entry Name ="rbx" Order = "1" Size ="8" />
            <Entry Name ="rcx" Order = "2" Size ="8" />
            <Entry Name ="rdx" Order = "3" Size ="8" />
            <Entry Name ="rsi" Order = "4" Size ="8" />
            <Entry Name ="rdi" Order = "5" Size ="8" />
            <Entry Name ="rbp" Order = "6" Size ="8" />
            <Entry Name ="rsp" Order = "7" Size ="8" />
            <Entry Name ="r8"  Order = "8" Size ="8" />
            <Entry Name ="r9"  Order = "9" Size ="8" />
            <Entry Name ="r10" Order = "a" Size ="8" />
            <Entry Name ="r11" Order = "b" Size ="8" />
            <Entry Name ="r12" Order = "c" Size ="8" />
            <Entry Name ="r13" Order = "d" Size ="8" />
            <Entry Name ="r14" Order = "e" Size ="8" />
            <Entry Name ="r15" Order = "f" Size ="8" />
            <Entry Name ="rip" Order = "10" Size ="8" />
            <!-- <flags id="x64_eflags" size="4">
                <field name="" start="22" end="31"/>
                <field name="ID" start="21" end="21"/>
                <field name="VIP" start="20" end="20"/>
                <field name="VIF" start="19" end="19"/>
                <field name="AC" start="18" end="18"/>
                <field name="VM" start="17" end="17"/>
                <field name="RF" start="16" end="16"/>
                <field name="" start="15" end="15"/>
                <field name="NT" start="14" end="14"/>
                <field name="IOPL" start="12" end="13"/>
                <field name="OF" start="11" end="11"/>
                <field name="DF" start="10" end="10"/>
                <field name="IF" start="9" end="9"/>
                <field name="TF" start="8" end="8"/>
                <field name="SF" start="7" end="7"/>
                <field name="ZF" start="6" end="6"/>
                <field name="" start="5" end="5"/>
                <field name="AF" start="4" end="4"/>
                <field name="" start="3" end="3"/>
                <field name="PF" start="2" end="2"/>
                <field name="" start="1" end="1"/>
                <field name="CF" start="0" end="0"/>
            </flags> -->
            <Entry Name ="eflags" Order = "11" Size ="4" />

            <!-- Segment registers -->
            <Entry Name ="cs" Order = "12" Size ="4" />
            <Entry Name ="ss" Order = "13" Size ="4" />
            <Entry Name ="ds" Order = "14" Size ="4" />
            <Entry Name ="es" Order = "15" Size ="4" />
            <Entry Name ="fs" Order = "16" Size ="4" />
            <Entry Name ="gs" Order = "17" Size ="4" />

            <!-- Segment descriptor caches and TLS base MSRs -->
            <!--Entry Name ="cs_base" Order = "18" Size="8"/
            <Entry Name ="ss_base" Order = "18" Size ="8" />
            <Entry Name ="ds_base" Order = "19" Size ="8" />
            <Entry Name ="es_base" Order = "1a" Size ="8" /> -->
            <Entry Name ="fs_base" Order = "18" Size ="8" />
            <Entry Name ="gs_base" Order = "19" Size ="8" />
            <Entry Name ="k_gs_base" Order = "1a" Size ="8" />

            <!-- Control registers -->
            <!-- the cr0 register format fields:
            <flags id="x64_cr0" size="8">
            <field name="PG" start="31" end="31"/>
            <field name="CD" start="30" end="30"/>
            <field name="NW" start="29" end="29"/>
            <field name="AM" start="18" end="18"/>
            <field name="WP" start="16" end="16"/>
            <field name="NE" start="5" end="5"/>
            <field name="ET" start="4" end="4"/>
            <field name="TS" start="3" end="3"/>
            <field name="EM" start="2" end="2"/>
            <field name="MP" start="1" end="1"/>
            <field name="PE" start="0" end="0"/>
            </flags> -->
            <Entry Name ="cr0" Order = "1b" Size ="8" />
            <Entry Name ="cr2" Order = "1c" Size ="8" />

            <!-- the cr3 register format fields:
            <flags id="x64_cr3" size="8">
                <field name="PDBR" start="12" end="63"/>
                <field name="PCID" start="0" end="11"/>
            </flags> -->
            <Entry Name ="cr3" Order = "1d" Size ="8" />

            <!-- the cr4 register format fields:
            <flags id="x64_cr4" size="8">
                <field name="PKE" start="22" end="22"/>
                <field name="SMAP" start="21" end="21"/>
                <field name="SMEP" start="20" end="20"/>
                <field name="OSXSAVE" start="18" end="18"/>
                <field name="PCIDE" start="17" end="17"/>
                <field name="FSGSBASE" start="16" end="16"/>
                <field name="SMXE" start="14" end="14"/>
                <field name="VMXE" start="13" end="13"/>
                <field name="LA57" start="12" end="12"/>
                <field name="UMIP" start="11" end="11"/>
                <field name="OSXMMEXCPT" start="10" end="10"/>
                <field name="OSFXSR" start="9" end="9"/>
                <field name="PCE" start="8" end="8"/>
                <field name="PGE" start="7" end="7"/>
                <field name="MCE" start="6" end="6"/>
                <field name="PAE" start="5" end="5"/>
                <field name="PSE" start="4" end="4"/>
                <field name="DE" start="3" end="3"/>
                <field name="TSD" start="2" end="2"/>
                <field name="PVI" start="1" end="1"/>
                <field name="VME" start="0" end="0"/>
            </flags> -->
            <Entry Name ="cr4" Order = "1e" Size ="8" />
            <Entry Name ="cr8" Order = "1f" Size ="8" />

            <!-- the efer register format fields:
            <flags id="x64_efer" size="8">
            <field name="TCE" start="15" end="15"/>
            <field name="FFXSR" start="14" end="14"/>
            <field name="LMSLE" start="13" end="13"/>
            <field name="SVME" start="12" end="12"/>
            <field name="NXE" start="11" end="11"/>
            <field name="LMA" start="10" end="10"/>
            <field name="LME" start="8" end="8"/>
            <field name="SCE" start="0" end="0"/>
            </flags> -->
            <Entry Name ="efer" Order = "20" Size ="8"/>

            <!-- x87 FPU -->
            <Entry Name ="st0" Order = "21" Size ="10" />
            <Entry Name ="st1" Order = "22" Size ="10" />
            <Entry Name ="st2" Order = "23" Size ="10" />
            <Entry Name ="st3" Order = "24" Size ="10" />
            <Entry Name ="st4" Order = "25" Size ="10" />
            <Entry Name ="st5" Order = "26" Size ="10" />
            <Entry Name ="st6" Order = "27" Size ="10" />
            <Entry Name ="st7" Order = "28" Size ="10" />
            <Entry Name ="fctrl" Order = "29" Size ="4" />
            <Entry Name ="fstat" Order = "2a" Size ="4" />
            <Entry Name ="ftag"  Order = "2b" Size ="4" />
            <Entry Name ="fiseg" Order = "2c" Size ="4" />
            <Entry Name ="fioff" Order = "2d" Size ="4" />
            <Entry Name ="foseg" Order = "2e" Size ="4" />
            <Entry Name ="fooff" Order = "2f" Size ="4" />
            <Entry Name ="fop" Order = "30" Size ="4" />
            <Entry Name ="xmm0" Order = "31" Size ="16"  />
            <Entry Name ="xmm1" Order = "32" Size ="16"  />
            <Entry Name ="xmm2" Order = "33" Size ="16"  />
            <Entry Name ="xmm3" Order = "34" Size ="16"  />
            <Entry Name ="xmm4" Order = "35" Size ="16"  />
            <Entry Name ="xmm5" Order = "36" Size ="16"  />
            <Entry Name ="xmm6" Order = "37" Size ="16"  />
            <Entry Name ="xmm7" Order = "38" Size ="16"  />
            <Entry Name ="xmm8" Order = "39" Size ="16"  />
            <Entry Name ="xmm9" Order = "3a" Size ="16"  />
            <Entry Name ="xmm10" Order = "3b" Size ="16"  />
            <Entry Name ="xmm11" Order = "3c" Size ="16"  />
            <Entry Name ="xmm12" Order = "3d" Size ="16"  />
            <Entry Name ="xmm13" Order = "3e" Size ="16"  />
            <Entry Name ="xmm14" Order = "3f" Size ="16"  />
            <Entry Name ="xmm15" Order = "40" Size ="16"  />
            
            <!-- the mxcsr register format fields:
            <flags id="x64_mxcsr" size="4">
                <field name="IE" start="0" end="0"/>
                <field name="DE" start="1" end="1"/>
                <field name="ZE" start="2" end="2"/>
                <field name="OE" start="3" end="3"/>
                <field name="UE" start="4" end="4"/>
                <field name="PE" start="5" end="5"/>
                <field name="DAZ" start="6" end="6"/>
                <field name="IM" start="7" end="7"/>
                <field name="DM" start="8" end="8"/>
                <field name="ZM" start="9" end="9"/>
                <field name="OM" start="10" end="10"/>
                <field name="UM" start="11" end="11"/>
                <field name="PM" start="12" end="12"/>
                <field name="FZ" start="15" end="15"/>
            </flags> -->
            <Entry Name ="mxcsr" Order = "41" Size ="4" />

        </ExdiGdbServerRegisters>
    </ExdiGdbServerConfigData>
    </ExdiTarget>
    </ExdiTargets>
</ExdiTargets>

Örnek EXDI PowerShell betiği

Bu örnek PowerShell betiği EXDI'yi yükler ve hata ayıklayıcısını başlatır. Start-ExdiDebugger.ps1 betiği gerekirse ExdiGdbSrv.dll yükler, xml ayarları dosyalarını yapılandırır, dllhost.exe işlemlerini çalıştırıp çalıştırmadığını denetler ve zaten çalışan bir gdb sunucusu donanım hata ayıklama hedefine bağlanmak için hata ayıklayıcıyı başlatır.

WinDBg ile mevcut kullanıcı arabirimi kullanıldığında, ExdiGdbSrv.dll zaten yüklüdür ve bu betik geçerli değildir. Yerleşik kullanıcı arabirimini kullanma hakkında daha fazla bilgi için bkz. EXDI Hata Ayıklayıcı Aktarımını Yapılandırma.

Bu, başlangıç betiğini çağırma örneğidir.

PS>.\Start-ExdiDebugger.ps1 -ExdiTarget "QEMU" -GdbPort 1234 -Architecture x64

Gerekirse, yerleşik dosyaları da belirtebilirsiniz.

PS>.\Start-ExdiDebugger.ps1 -ExdiTarget "QEMU" -GdbPort 1234 -Architecture x64 -ExdiDropPath "C:\path\to\built\exdi\files"

Start-ExdiDebugger.ps1'nın aşağıdaki ayar seçenekleri şunlardır.

Parametre Açıklama
ExdiTarget Bağlanacak hedefin türü. Bu, ayarlar xml dosyasındaki belirli bir bölüme karşılık gelir
Sunucu Adı gdb sunucusu oturumunu barındıran bilgisayarın IP adresi veya ana bilgisayar adı (varsayılan olarak "LocalHost" olarak adlandırılır)
GdbPort gdb sunucusunun dinlediği Bağlantı Noktası.
Mimarlık Donanım hata ayıklama hedefinin mimarisi (bu parametre, xml ayarları dosyasındaki ArchitectureFamily parametresini de ifade eder)
ExdiDropPath ExdiGdbSrv.dll, exdiConfigData.xmlve systemregisters.xml dosyalarının konumu. Bunlar yalnızca ExdiGdbSrv.dll yüklü değilse veya yanlış yüklenmişse kopyalanır.
ExtraDebuggerArgs Hata ayıklayıcı komut satırına iletmek için ek bağımsız değişkenler
PreNTAppDebugging HeuristicScanSize değerini, 0xfffe (NT için en iyisi) olan değerden 0xffe'ye (NT öncesi uygulamalar için) değiştirir.
DontTryDllHostCleanup dllhost.exe'da mevcut çalışan ExdiGdbSrv.dll örneklerinin denetlenmesi için yükseltme gerekir. Bu anahtarın sağlanması betiğin yükseltme olmadan çalışmasına olanak tanır (hata ayıklayıcı düzgün çalışmayabilir).

Paketlerin görüntülenmesini etkinleştirmek için displayCommPackets değerini evet olarak ayarlayın.

    [pscustomobject]@{ Path = 'displayCommPackets'                                  ; value = "yes" } 
.\Start-ExdiDebugger.ps1 -ExdiTarget "QEMU" -GdbPort 1234 -Architecture x64 -ExdiDropPath "C:\path\to\built\exdi\files"

Daha fazla ayar seçeneği için kod açıklamalarına bakın.

<#
.Synopsis
    Installs and launches exdi debugger (automating xml file editing)

.Description
    This script will install ExdiGdbSrv.dll if required, configure the xml settings
    files, check for running dllhost.exe processes, and launch the debugger to connect to
    an already running gdb server hardware debugging target.

.Parameter ExdiTarget
    Type of target to connect to. This corresponds to a specific section in the settings xml file

.Parameter HostName
    IP address or hostname of the computer hosting the gdb server session (defaults to "LocalHost")

.Parameter GdbPort
    Port that the gdb server is listening on.

.Parameter Architecture
    Architecture of the hardware debugging target (this parameter also implies the ArchitectureFamily
    parameter in the xml settings file)

.Parameter ExdiDropPath
    Location of the ExdiGdbSrv.dll, exdiConfigData.xml, and systemregisters.xml files. These will
    only be copied if ExdiGdbSrv.dll is not installed or is installed incorrectly.

.Parameter ExtraDebuggerArgs
    Extra arguments to pass on the debugger command line

.Parameter PreNTAppDebugging
    Changes the value of the heuristicScanSize from 0xfffe (best for NT) to 0xffe (for pre-NT Apps)

.Parameter DontTryDllHostCleanup
    Checking for existing running instances of ExdiGdbSrv.dll in dllhost.exe requires elevation.
    Providing this switch will allow the script to run without elevation (although the debugger may not
    function correctly).

.Example
    >---------------- (first run) ------------<
    .\Start-ExdiDebugger.ps1 -ExdiTarget "QEMU" -GdbPort 1234 -Architecture x64 -ExdiDropPath "C:\path\to\built\exdi\files"

.Example
    PS>.\Start-ExdiDebugger.ps1 -ExdiTarget "QEMU" -GdbPort 1234 -Architecture x64
#>

[CmdletBinding()]
param
(
    [ValidateSet("QEMU")]
    [string]
    $ExdiTarget = "QEMU",

    [string]
    $HostName = "LocalHost",

    [Parameter(Mandatory=$true)]
    [Int]
    $GdbPort,

    [Parameter(Mandatory=$true)]
    [string]
    [ValidateSet("x86", "x64", "arm64")]
    $Architecture,

    [string]
    $ExdiDropPath,

    [string]
    $DebuggerPath,

    [string[]]
    $ExtraDebuggerArgs = @(),

    [switch]
    $PreNTAppDebugging,

    [switch]
    $DontTryDllHostCleanup
)

$ErrorActionPreference = "Stop"

#region Functions

Function Test-Admin
{
    ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]"Administrator")
}

Function Find-PathToWindbgX
{
    $InternalWindbgXPath = "$env:LOCALAPPDATA\DBG\UI\WindbgX.exe"
    $ExternalWindbgXPath = "$env:LOCALAPPDATA\Microsoft\WindowsApps\WinDbgX.exe"

    if (Test-Path $InternalWindbgXPath -PathType Leaf)
    {
        return $InternalWindbgXPath
    }
    elseif (Test-Path $ExternalWindbgXPath -PathType Leaf)
    {
        return $ExternalWindbgXPath
    }
}

Function Test-ParameterValidation
{
    $CommandName = $PSCmdlet.MyInvocation.InvocationName
    $ParameterList = (Get-Command -Name $CommandName).Parameters

    foreach ($Parameter in $ParameterList) {
        Get-Variable -Name $Parameter.Values.Name -ErrorAction SilentlyContinue | Out-String | Write-Verbose
    }

    if (-not $DebuggerPath)
    {
        throw "WindbgX is not installed"
    }
    elseif (-not (Test-Path $DebuggerPath -PathType Leaf))
    {
        throw "DebuggerPath param ($DebuggerPath) does not point to a debugger."
    }

    # Searching for loaded instances of ExdiGdbSrv.dll in dllhost.exe requires elevation
    if (-not $DontTryDllHostCleanup -and
        -not $(Test-Admin))
    {
        throw "Searching for loaded instances of ExdiGdbSrv.dll in dllhost.exe requires elevation. Run with the -DontTryDllHostCleanup parameter to skip this check (debugger session init may fail)."
    }
}

Function Get-ExdiInstallPath
{
    Get-ItemPropertyValue -Path "Registry::HKEY_CLASSES_ROOT\CLSID\{29f9906e-9dbe-4d4b-b0fb-6acf7fb6d014}\InProcServer32" -Name "(default)" -ErrorAction SilentlyContinue
}

Function Test-ExdiServerInstalled
{
    # Check registration of exdi server class
    if ($(Get-ExdiInstallPath) -ne $null -and $(Test-Path "$(Get-ExdiInstallPath)"))
    {
        Write-Verbose "Exdi server is installed. Checking installation..."
        $ExdiInstallDir = [System.IO.Path]::GetDirectoryName($(Get-ExdiInstallPath))
        if (-not (Test-Path $ExdiInstallDir))
        {
            Write-Host "Currently Registered exdi server does not exist. Reinstalling..."
            return $false
        }
        elseif (-not ((Test-Path "$ExdiInstallDir\exdiConfigData.xml") -and (Test-Path "$ExdiInstallDir\systemregisters.xml")))
        {
            Write-Host "Currently Registered exdi server does not have required xml settings files. Reinstalling..."
            return $false
        }
        else
        {
            Write-Verbose "Exdi server is insalled correctly. Skipping installation..."
            return $true
        }
    }
    else
    {
        Write-Host "Exdi server is not installed. Installing..."
        return $false
    }
}

Function Install-ExdiServer
{
    [CmdletBinding()]
    param
    (
        [string] $InstallFrom,
        [string] $InstallTo
    )
    
    if (-not $(Test-Admin))
    {
        throw "Script needs to be run as an Admin to install exdi software."
    }

    New-Item -ItemType Directory $InstallTo -ErrorAction SilentlyContinue | Write-Verbose
    Copy-Item -Path "$InstallFrom\ExdiGdbSrv.dll" -Destination $InstallTo -ErrorAction stop | Write-Verbose
    Copy-Item -Path "$InstallFrom\exdiConfigData.xml" -Destination $InstallTo -ErrorAction stop | Write-Verbose
    Copy-Item -Path "$InstallFrom\systemregisters.xml" -Destination $InstallTo -ErrorAction stop | Write-Verbose
    regsvr32 /s "$InstallTo\ExdiGdbSrv.dll"

    if ($(Get-ExdiInstallPath) -eq $null)
    {
        throw "Unable to install exdi server"
    }
}

Function Edit-ExdiConfigFile
{
    [CmdletBinding()]
    param
    (
        [string] $ExdiFilePath,
        [string] $ExdiTargetType,
        [PSCustomObject[]] $XmlSettingPathValueList
    )
    
    # Edit exdiConfigData.xml
    [xml]$exdiConfigXml = Get-Content "$ExdiFilePath"

    # Set current target
    $exdiConfigXml.ExdiTargets.CurrentTarget = $ExdiTarget

    # set HostNameAndPort
    $ExdiTargetXmlNode = $exdiConfigXml.SelectSingleNode("//ExdiTargets/ExdiTarget[@Name='$ExdiTarget']/ExdiGdbServerConfigData")

    foreach ($XmlSettingPathValue in $XmlSettingPathValueList)
    {
        Write-Verbose "Processing $XmlSettingPathValue"
        if ($XmlSettingPathValue.Value -eq $null)
        {
            continue
        }

        $PathParts = $XmlSettingPathValue.Path.Split(".")
        $curNode = $ExdiTargetXmlNode
        if ($PathParts.Count -gt 1)
        {
            foreach ($PathPart in $PathParts[0..($PathParts.Count-2)])
            {
                Write-Verbose $PathPart
                $curNode = $curNode.($PathPart)
            }
        }
        $curNode.($PathParts[-1]) = $XmlSettingPathValue.Value
    }

    $exdiConfigXml.Save("$ExdiFilePath")
}

Function Stop-ExdiContainingDllHosts
{
    $DllHostPids = Get-Process dllhost | ForEach-Object { $_.Id }
    foreach ($DllHostPid in $DllHostPids)
    {
        $DllHostExdiDlls = Get-Process -Id $DllHostPid -Module | Where-Object { $_.FileName -like "*ExdiGdbSrv.dll" }
        if ($DllHostExdiDlls.Count -ne 0)
        {
            Write-Verbose "Killing dllhost.exe with pid $DllHostPid (Contained instance of ExdiGdbSrv.dll)"
            Stop-Process -Id $DllHostPid -Force
        }
    }
}

#endregion

#region Script

# Apply defaults for $DebuggerPath before Parameter validation
if (-not $DebuggerPath)
{
    $DebuggerPath = Find-PathToWindbgX
}

Test-ParameterValidation

# look clean up dllhost.exe early since it can hold a lock on files which
# need to be overwritten
if (-not $DontTryDllHostCleanup)
{
    Stop-ExdiContainingDllHosts
}

if (-not $(Test-ExdiServerInstalled))
{
    if (-not $ExdiDropPath)
    {
        throw "ExdiServer is not installed and -ExdiDropPath is not valid"
    }

    $ExdiInstallDir = Join-Path -Path "$([System.IO.Path]::GetDirectoryName($DebuggerPath))" -ChildPath "exdi"
    Install-ExdiServer -InstallFrom "$ExdiDropPath" -InstallTo "$ExdiInstallDir"
}

$SystemRegistersFilepath = Join-Path -Path "$([System.IO.Path]::GetDirectoryName($(Get-ExdiInstallPath)))" -ChildPath "systemregisters.xml"
$ExdiConfigFilepath      = Join-Path -Path "$([System.IO.Path]::GetDirectoryName($(Get-ExdiInstallPath)))" -ChildPath "exdiConfigData.xml"

# Calculate implied parameters
$HeuristicScanSize = if ($PreNTAppDebugging) { "0xffe" } else { "0xfffe" }
$ArchitectureFamily = switch($Architecture)
{
    x64   { "ProcessorFamilyx64" }
    x86   { "ProcessorFamilyx86" }
    arm64 { "ProcessorFamilyARM64" }
}

# Path is evaluated relative to the relevant ExdiTarget's ExdiGdbServerConfigData node in the xml schema
$SettingsToChange = @(
    [pscustomobject]@{ Path = 'GdbServerConnectionParameters.Value.HostNameAndPort' ; Value = "${HostName}:$GdbPort" },
    [pscustomobject]@{ Path = 'ExdiGdbServerTargetData.targetArchitecture'          ; Value = "$Architecture" },
    [pscustomobject]@{ Path = 'ExdiGdbServerTargetData.targetFamily'                ; Value = "$ArchitectureFamily" },
    [pscustomobject]@{ Path = 'ExdiGdbServerTargetData.heuristicScanSize'           ; Value = "$HeuristicScanSize" },
    [pscustomobject]@{ Path = 'displayCommPackets'                                  ; value = "no" }
)
Edit-ExdiConfigFile -ExdiFilePath "$ExdiConfigFilepath" -ExdiTargetType "$ExdiTarget" -XmlSettingPathValueList $SettingsToChange

# Set env vars for debugger
[System.Environment]::SetEnvironmentVariable('EXDI_GDBSRV_XML_CONFIG_FILE',"$ExdiConfigFilepath")
[System.Environment]::SetEnvironmentVariable('EXDI_SYSTEM_REGISTERS_MAP_XML_FILE',"$SystemRegistersFilepath")

$DebuggerArgs = @("-v", "-kx exdi:CLSID={29f9906e-9dbe-4d4b-b0fb-6acf7fb6d014},Kd=Guess,DataBreaks=Exdi")
Write-Verbose "DebuggerPath = $DebuggerPath"
Start-Process -FilePath "$DebuggerPath" -ArgumentList ($DebuggerArgs + $ExtraDebuggerArgs)

#endregion

Ayrıca bakınız

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

EXDI Kullanarak QEMU Kernel-Mode Hata Ayıklamayı Ayarlama

.exdicmd (EXDI Komutu)

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