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, 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.
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.
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
Otomatik olarak KDNET Ağ Çekirdeği Hata Ayıklamasını Ayarlama