Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Topik ini menjelaskan cara mengonfigurasi opsi tingkat lanjut menggunakan file Konfigurasi XML EXDI. Untuk informasi umum tentang menggunakan antarmuka pengguna WinDbg untuk mengonfigurasi EXDI, lihat Mengonfigurasi ExDI Debugger Transport. Pengaturan paling umum tersedia di antarmuka pengguna, yang merupakan pendekatan yang lebih mudah kemudian mengedit file Konfigurasi XML EXDI secara manual, dijelaskan di sini.
Extended Debugging Interface (EXDI) adalah lapisan adaptasi antara debugger perangkat lunak dan target penelusuran kesalahan. Alat Penelusuran Kesalahan untuk Windows mendukung penelusuran kesalahan kernel menggunakan EXDI yang dimulai dengan Windows versi 22000.
Catatan
EXDI adalah bentuk debugging khusus yang canggih untuk lingkungan tertentu. Menggunakan koneksi KDNET standar lebih mudah dikonfigurasi, dan disarankan. Untuk menyiapkan penelusuran kesalahan jaringan secara otomatis, lihat Menyiapkan Penelusuran Kesalahan Kernel Jaringan KDNET Secara Otomatis.
Mengonfigurasi opsi tingkat lanjut menggunakan file XML konfigurasi EXDI
Ada dua file xml yang diperlukan yang digunakan oleh server EXDI GDB COM (ExdiGdbSrv.dll).
exdiConfigData.xml - File ini berisi data konfigurasi utama yang diperlukan oleh klien server GDB untuk membuat sesi GDB yang berhasil dengan target server GDB debugger HW, sehingga klien server GDB tidak akan berjalan jika lokasi file tidak diatur oleh variabel lingkungan EXDI_GDBSRV_XML_CONFIG_FILE. Setiap tag xml memungkinkan konfigurasi set fungsionalitas server GDB tertentu. Lihat di bawah ini untuk daftar atribut yang dapat Anda ubah di XML, dan sampel XML.
Systemregister.xml - File ini berisi pemetaan antara register sistem dan kode yang digunakan untuk mengakses register. Ini diperlukan karena kode akses tidak disediakan oleh server GDB dalam file xml, dan debugger mengakses setiap pendaftaran sistem melalui kode akses. Jika file tidak diatur melalui variabel
EXDI_SYSTEM_REGISTERS_MAP_XML_FILE
lingkungan , maka ExdiGdbSrv.dll akan terus berfungsi, tetapi debugger tidak akan dapat mengakses register sistem apa pun melalui perintah rdmsr atau wrmsr. Daftar register ini harus didukung oleh debugger perangkat keras server GDB (nama register sistem tertentu harus ada dalam daftar register yang dikirim dalam file xml sistem).
EXDI UI dan file konfigurasi XML
EXDI UI di WinDbg menggunakan parameter file XML dan menggabungkan dalam parameter yang diperlukan UI, seperti nilai IP:Port. Jika ada kebutuhan untuk memodifikasi parameter file XML default, luncurkan aplikasi WinDbgNext dari baris perintah dengan parameter PathToSrvCfgFiles=<path to the modified exdiconfigdata.xml file>
.
Arsitektur target
Nilai bidang arsitektur target UI EXDI perlu mencocokkan OS Windows yang berjalan pada target hanya untuk stub server GDB yang tidak menerapkan file XML deskripsi target yang menjelaskan arsitektur target OS Windows. Informasi file target.xml ini dikirim oleh stub server GDB selama jabat tangan protokol GDB-RSP antara klien GDB dan stub server GDB.
Windbg-ExdiGdbSrv masih dapat mengatur arsitektur OS target yang benar meskipun pengguna menetapkan nilai input bidang arsitektur target yang salah di EXDI UI. Arsitektur OS target akan diambil dan dikonfigurasi dari file deskripsi target.xml yang disediakan oleh server GDB yang menyertakan file target.xml dalam jabat tangan server GDB. Untuk memeriksa arsitektur target, gunakan perintah debugger .effmach komputer yang efektif.
Tag dan atribut GDBServer
Tabel berikut menjelaskan tag dan atribut GDBServer yang ditentukan dalam exdiConfigData.xml
file.
Parameter | Deskripsi |
---|---|
ExdiTargets | Menentukan konfigurasi target server GDB tertentu mana yang akan digunakan oleh ExdiGgbSrv.dll untuk membuat koneksi GDB dengan target server GDB, karena file exdiConfigData.xml mencakup semua server GDB yang saat ini didukung oleh ExdiGdbSrv.dll (file ini HARUS diisi sebelum menggunakan ExdiGdbSrv.dll dengan server GDB tertentu). |
CurrentTarget | Menentukan nama target server GDB (misalnya, nilai atribut ini harus cocok dengan nilai nama salah <ExdiTarget Name= satu tag yang disertakan oleh file exdiConfigData.xml. |
ExdiTarget | ini adalah tag mulai untuk semua data konfigurasi yang disertakan oleh setiap komponen target server GDB. |
Nama | Menentukan nama server GDB (misalnya QEMU, BMC-OpenOCD, Trace32, VMWare). |
agentNamePacket | Ini adalah nama klien GDB karena dikenali oleh debugger HW server GDB. Ini dapat digunakan oleh debugger HW server GDB untuk mengonfigurasi dirinya untuk klien GDB tertentu (misalnya server Trace32 GDB memerlukan ExdiGdbSrv.dll untuk mengirim nama "QMS.windbg" untuk mengidentifikasi klien windbg-GDB dan kemudian mengaktifkan paket memori GDB yang disesuaikan hanya didukung untuk klien server MS GDB (exdiGdbSrv.dll). |
ExdiGdbServerConfigData | Menentukan parameter konfigurasi terkait komponen ExdiGdbSrv.dll. |
uuid | menentukan UUI komponen ExdiGdbSrv.dll. |
displayCommPackets | Benderai jika 'ya', maka kita akan menampilkan karakter komunikasi protokol RSP di jendela log perintah. Jika 'tidak', maka kami hanya menampilkan teks pasangan permintaan-respons. |
enableThrowExceptionOnMemoryErrors | Atribut ini akan diperiksa oleh klien server GDB ketika ada paket respons kesalahan GDB (E0x) untuk menentukan apakah klien harus melempar pengecualian dan berhenti membaca memori. |
qSupportedPacket | Ini memungkinkan konfigurasi klien GDB untuk meminta file arsitektur xml register mana yang harus dikirim oleh debugger HW server GDB mengikuti file deskripsi target xml (pada dasarnya, klien akan menginformasikan server GDB arsitektur mana yang didukung oleh klien, saat ini, klien memang mendukung arsitektur x64). |
ExdiGdbServerTargetData | Menentukan parameter yang terkait dengan Target perangkat keras yang di-debug oleh sesi GdbServer. |
targetArchitecture | String yang berisi arsitektur perangkat keras target. Nilai yang mungkin: X86, X64, ARM, ARM64. Saat ini, exdiGdbSrv.dll hanya mendukung X86 dan ARM. |
targetFamily | String yang berisi keluarga perangkat keras target. Nilai yang mungkin: ProcessorFamilyX86, ProcessorFamilyX64, ProcessorFamilyARM, ProcessorFamilyARM64. |
numberOfCores | Jumlah inti prosesor yang didukung target. Parameter ini akan divalidasi ketika kita menggunakan sesi multi-Gdbserver (sesi T32-GdbServer). Atribut 'MultiCoreGdbServerSessions' di bawah ini harus diatur ke 'ya'. |
EnableSseContext | Benderai jika 'ya', maka paket RSP konteks 'g' akan menyertakan nilai floating point registers. Parameter ini masuk akal hanya untuk target keluarga Intel. |
heuristicScanSize | ini mengonfigurasi algoritma heuristik cepat mesin debugger untuk mengurangi pemeriksaan memori yang dipindai dengan ukuran yang ditentukan, jika nilai atribut tidak ditentukan (atau "0"), maka mesin debugger tidak akan menggunakan heuristik cepat dan kembali ke heuristik warisan yang memindai seluruh memori yang mencari tanda tangan PE DOS. Nilai ukuran pemindaian umum adalah 0xfffe (terbaik untuk NT) atau 0xffe (untuk Aplikasi pra-NT). |
targetDescriptionFile | menentukan apakah server GDB mengirim file header deskripsi target sebelum mengirim setiap file xml terpisah. Bidang ini kosong maka klien server GDB tidak akan meminta register sistem arsitektur xml (misalnya server Trace32 GDB yang tidak mendukung pengiriman register arsitektur dalam file xml terpisah). |
GdbServerConnectionParameters | Menentukan parameter sesi GdbServer. Parameter ini digunakan untuk mengontrol sesi RSP GdbServer antara komponen ExdiGdbSrv.dll dan GdbServer. |
MultiCoreGdbServerSessions | Benderai Jika 'ya', maka kita akan memiliki sesi GdbServer multi-core (yang digunakan oleh T32-GdbServer Back-End). Jika 'tidak', maka kita hanya akan berkomunikasi dengan satu instans GdbServer. |
MaximumGdbServerPacketLength | Ini adalah panjang maksimum yang didukung GdbServer untuk satu paket. |
MaximumConnectAttempts | Ini adalah upaya koneksi maksimum. Ini digunakan oleh ExdiGdbSrv.dll ketika mencoba membuat koneksi RSP ke GdbServer. |
SendPacketTimeout | Ini adalah batas waktu pengiriman RSP. |
ReceivePacketTimeout | Ini adalah batas waktu penerimaan RSP. |
HostNameAndPort | Ini adalah string koneksi dalam format <hostname/ip address:Port number> . Mungkin ada lebih dari satu string koneksi GdbServer (seperti sesi GdbServer multi-core T32). Jumlah string koneksi harus cocok dengan jumlah inti. |
ExdiGdbServerMemoryCommands | Menentukan berbagai cara untuk mengeluarkan perintah memori GDB, untuk mendapatkan sistem mendaftarkan nilai atau membaca/menulis memori akses pada tingkat CPU pengecualian yang berbeda (misalnya BMC-OpenOCD menyediakan akses ke register CP15 melalui "aarch64 mrs nsec/dtk <access code> " perintah disesuaikan). |
GdbSpecialMemoryCommand | jika "ya", maka server GDB mendukung perintah memori yang disesuaikan (misalnya register sistem, ini harus diatur untuk server Trace32 GDB). |
PhysicalMemory | jika "ya", maka server GDB mendukung perintah yang disesuaikan untuk membaca memori fisik (diatur untuk server Trace32 GDB). |
SupervisorMemory | jika "ya", maka server GDB mendukung perintah yang disesuaikan untuk membaca memori supervisor (diatur untuk server Trace32 GDB). |
SpecialMemoryRegister | jika "ya", maka server GDB mendukung perintah yang disesuaikan untuk membaca register sistem (diatur untuk server Trace32 GDB) |
SystemRegistersGdbMonitor | jika "ya", maka server GDB mendukung perintah yang disesuaikan melalui perintah monitor GDB (diatur untuk BMC Open-OCD). |
SystemRegisterDecoding | jika "ya", maka klien GDB menerima decoding kode akses sebelum mengirim perintah monitor GDB. |
ExdiGdbServerRegisters | Menentukan set inti register arsitektur tertentu. |
Sistem | Arsitektur CPU dari kumpulan register yang ditentukan. |
FeatureNameSupported | Ini adalah nama grup pendaftaran sistem karena disediakan oleh file deskripsi daftar sistem xml. Diperlukan untuk mengidentifikasi grup xml daftar sistem yang merupakan bagian dari file xml seperti yang dikirim oleh server GDB. |
SystemRegistersStart | Ini untuk mengidentifikasi register sistem pertama (nomor/pesanan register rendah) yang dilaporkan sebagai bagian dari set register inti (misalnya pada X64, QEMU tidak melaporkan sistem x64 register yang ditetapkan sebagai file deskripsi target xml yang dipisahkan, sehingga regs sistem adalah bagian dari register inti). |
SystemRegistersEnd | Ini untuk mengidentifikasi register sistem terakhir (nomor/pesanan register tinggi) yang dilaporkan sebagai bagian dari set register inti. |
Nama | Nama register. |
Pesanan | Ini adalah angka yang mengidentifikasi indeks dalam array register. Nomor ini akan digunakan oleh klien GDB dan paket register set/query server (p<number>”/”q<number> ). |
Ukuran | Ini adalah ukuran register dalam byte. |
Contoh file exdiConfigData.xml
<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>
Contoh skrip EXDI PowerShell
Sampel skrip PowerShell ini menginstal EXDI lalu meluncurkan debugger. Skrip Start-ExdiDebugger.ps1 akan menginstal ExdiGdbSrv.dll jika diperlukan, mengonfigurasi file pengaturan xml, memeriksa proses dllhost.exe yang berjalan, dan meluncurkan debugger untuk menyambungkan ke target debugging perangkat keras server gdb yang sudah berjalan.
Saat menggunakan antarmuka pengguna yang valid dengan WinDBg, ExdiGdbSrv.dll sudah diinstal, dan skrip ini tidak relevan. Untuk informasi selengkapnya tentang menggunakan antarmuka pengguna bawaan, lihat Mengonfigurasi ExDI Debugger Transport.
Ini adalah contoh memanggil skrip start up.
PS>.\Start-ExdiDebugger.ps1 -ExdiTarget "QEMU" -GdbPort 1234 -Architecture x64
Anda juga dapat menentukan file bawaan jika perlu.
PS>.\Start-ExdiDebugger.ps1 -ExdiTarget "QEMU" -GdbPort 1234 -Architecture x64 -ExdiDropPath "C:\path\to\built\exdi\files"
Start-ExdiDebugger.ps1 memiliki opsi pengaturan berikut.
Parameter | Deskripsi |
---|---|
ExdiTarget | Jenis target yang akan disambungkan. Ini sesuai dengan bagian tertentu dalam file xml pengaturan |
HostName | Alamat IP atau nama host komputer yang menghosting sesi server gdb (default ke "LocalHost") |
GdbPort | Port yang didengarkan server gdb. |
Sistem | Arsitektur target penelusuran kesalahan perangkat keras (parameter ini juga menyiratkan parameter ArchitectureFamily dalam file pengaturan xml) |
ExdiDropPath | Lokasi file ExdiGdbSrv.dll, exdiConfigData.xml, dan systemregisters.xml. Ini hanya akan disalin jika ExdiGdbSrv.dll tidak diinstal atau salah diinstal. |
ExtraDebuggerArgs | Argumen tambahan untuk meneruskan baris perintah debugger |
PreNTAppDebugging | Mengubah nilai heuristikScanSize dari 0xfffe (terbaik untuk NT) menjadi 0xffe (untuk Aplikasi pra-NT) |
DontTryDllHostCleanup | Memeriksa instans ExdiGdbSrv.dll yang sedang berjalan di dllhost.exe memerlukan elevasi. Menyediakan sakelar ini akan memungkinkan skrip berjalan tanpa elevasi (meskipun debugger mungkin tidak berfungsi dengan benar). |
Untuk mengaktifkan paket yang akan ditampilkan, atur nilai displayCommPackets ke ya.
[pscustomobject]@{ Path = 'displayCommPackets' ; value = "yes" }
.\Start-ExdiDebugger.ps1 -ExdiTarget "QEMU" -GdbPort 1234 -Architecture x64 -ExdiDropPath "C:\path\to\built\exdi\files"
Lihat komentar kode untuk opsi pengaturan lainnya.
<#
.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
Lihat juga
Mengonfigurasi Exdi Debugger Transport
Menyiapkan penelusuran kesalahan Mode Kernel QEMU menggunakan EXDI
Menyiapkan penelusuran kesalahan Kernel Jaringan KDNET secara otomatis