dx (Tampilkan Ekspresi Model Objek Debugger)
Perintah dx menampilkan ekspresi C++ menggunakan model ekstensi NatVis. Untuk informasi selengkapnya tentang NatVis, lihat Membuat tampilan kustom objek asli.
dx [-g|-gc #][-c #][-n|-v]-r[#] Expression[,<FormatSpecifier> ]
dx [{-?}|{-h}]
Parameter
Ekspresi
Ekspresi C++ yang akan ditampilkan.
-G
Tampilkan sebagai objek kisi data yang dapat diulang. Setiap elemen yang diulang adalah baris dalam kisi dan setiap anak tampilan dari elemen tersebut adalah kolom. Ini memungkinkan Anda untuk melihat sesuatu seperti array structs, di mana setiap elemen array ditampilkan dalam baris dan setiap bidang struct ditampilkan dalam kolom.
Memilih nama kolom (di mana ada tautan DML yang tersedia) akan diurutkan menurut kolom tersebut. Jika sudah diurutkan menurut kolom tersebut, urutan pengurutan akan terbalik.
Objek apa pun yang dapat diulang akan memiliki item menu konteks pilih dan tahan (atau klik kanan) yang ditambahkan melalui DML yang disebut 'Tampilkan sebagai Kisi'. Memilih dan menahan (atau mengklik kanan) objek di jendela output dan memilih ini akan menampilkan objek dalam tampilan kisi alih-alih tampilan pohon standar.
(+) yang ditampilkan oleh nama kolom menawarkan perilaku pilih dan tahan (atau klik kanan) dan pilih.
- Pilih mengambil kolom itu dan meledakkannya ke dalam tabelnya sendiri. Anda melihat baris asli ditambah turunan kolom yang diperluas.
- Pilih dan tahan (atau klik kanan) menyediakan "Perluas Ke Dalam Kisi" yang mengambil kolom dan menambahkannya kembali ke tabel saat ini sebagai kolom paling kanan.
-Gc #
Tampilkan sebagai kisi dan batasi ukuran sel kisi untuk jumlah karakter (#) yang ditentukan.
-c # Menampilkan kelanjutan kontainer (melompati # elemen kontainer). Opsi ini biasanya digunakan dalam skenario otomatisasi output kustom dan menyediakan "..." elemen kelanjutan di bagian bawah daftar.
-N Ada dua cara agar data dapat dirender. Menggunakan visualisasi NatVis (default) atau menggunakan struktur C/C++ asli yang mendasar. Tentukan parameter -n untuk merender output hanya menggunakan struktur C/C++ asli dan bukan visualisasi NatVis.
-v
Tampilkan informasi verbose yang mencakup metode dan objek non-khas lainnya.
-R#
Menampilkan subjenis (bidang) secara rekursif hingga # tingkat. Jika # tidak ditentukan, tingkat rekursi satu, adalah nilai default.
[<,FormatSpecifier>]
Gunakan salah satu penentu format berikut untuk mengubah penyajian default.
Penentu format | Deskripsi |
---|---|
X | Menampilkan ordinal dalam heksidamal |
D | Menampilkan ordinal dalam desimal |
O | Menampilkan ordinal dalam oktal |
B | Menampilkan ordinal dalam biner |
En | Tampilkan enum menurut nama saja (tanpa nilai) |
C | Tampilkan sebagai karakter tunggal (bukan string) |
S | Menampilkan string 8-bit seperti yang dikutip ASCII |
Sb | Menampilkan string 8-bit sebagai ASCII yang tidak dikutip |
,s8 | Tampilkan string 8-bit sebagai UTF-8 yang dikutip |
,s8b | Menampilkan string 8-bit sebagai UTF-8 yang tidak dikutip |
Su | Tampilkan string 16-bit seperti yang dikutip UTF-16 |
Sub | Menampilkan string 16-bit sebagai UTF-16 yang tidak dikunci |
,! | Menampilkan objek dalam mode mentah saja (misalnya tidak ada NatVis) |
,# | Tentukan panjang pointer/array/container sebagai nilai harfiah # (ganti dengan numerik) |
,[<ekspresi>] | Tentukan panjang pointer/array/container sebagai ekspresi ekspresi <> |
Nd | Jangan temukan tipe turunan (runtype) objek. Tampilkan nilai statis saja |
dx-?
Tampilkan bantuan baris perintah.
dx-h Menampilkan bantuan untuk objek yang tersedia di debugger.
dx-id
Penggunaan internal Microsoft saja. Digunakan untuk mengikuti tautan model data dalam output perintah.
Contoh penggunaan baris perintah
Perintah pengaturan .dx dapat digunakan untuk menampilkan informasi tentang objek Pengaturan Debug. Untuk informasi selengkapnya tentang objek pengaturan debug, lihat .settings.
kd> dx -r1 Debugger.Settings
Debugger.Settings
Debug
Display
EngineInitialization
Extensions
Input
Sources
Symbols
AutoSaveSettings : false
Gunakan opsi rekursi -r1 untuk melihat objek Debugger lainnya - Sesi, Pengaturan, dan Status.
kd> dx -r1 Debugger
Debugger
Sessions
Settings
State
Utility
LastEvent
Tentukan objek Debugger.Sessions dengan opsi rekursi -r3 untuk melakukan perjalanan lebih jauh ke bawah rantai objek.
kd> dx -r3 Debugger.Sessions
Debugger.Sessions
[0] : Remote KD: KdSrv:Server=@{<Local>},Trans=@{1394:Channel=0}
Processes
[0] : <Unknown Image>
[4] : <Unknown Image>
[304] : smss.exe
[388] : csrss.exe
[456] : wininit.exe
[468] : csrss.exe
[528] : services.exe
[536] : lsass.exe
[544] : winlogon.exe
[620] : svchost.exe
... ...
Tambahkan penentu format x untuk menampilkan nilai ordinal dalam heksadesimal.
kd> dx -r3 Debugger.Sessions,x
Debugger.Sessions,x
[0x0] : Remote KD: KdSrv:Server=@{<Local>},Trans=@{1394:Channel=0}
Processes
[0x0] : <Unknown Image>
[0x4] : <Unknown Image>
[0x130] : smss.exe
[0x184] : csrss.exe
[0x1c8] : wininit.exe
[0x1d4] : csrss.exe
[0x210] : services.exe
[0x218] : lsass.exe
[0x220] : winlogon.exe
[0x26c] : svchost.exe
[0x298] : svchost.exe
[0x308] : dwm.exe
[0x34c] : nvvsvc.exe
[0x37c] : nvvsvc.exe
[0x384] : svchost.exe
... ...
Contoh ini menggunakan sesi debug aktif untuk mencantumkan tumpukan panggilan utas pertama dalam proses pertama.
kd> dx -r1 Debugger.Sessions.First().Processes.First().Threads.First().Stack.Frames
Debugger.Sessions.First().Processes.First().Threads.First().Stack.Frames
[0x0] : nt!RtlpBreakWithStatusInstruction
[0x1] : nt!KdCheckForDebugBreak + 0x7a006
[0x2] : nt!KiUpdateRunTime + 0x42
[0x3] : nt!KiUpdateTime + 0x129
[0x4] : nt!KeClockInterruptNotify + 0x1c3
[0x5] : hal!HalpTimerClockInterruptEpilogCommon + 0xa
[0x6] : hal!HalpTimerClockInterruptCommon + 0x3e
[0x7] : hal!HalpTimerClockInterrupt + 0x1cb
[0x8] : nt!KiIdleLoop + 0x1a
Gunakan opsi -g untuk menampilkan output sebagai kisi data. Pilih kolom untuk diurutkan.
kd> dx -g @$curprocess.Modules
Gunakan opsi -h untuk menampilkan informasi tentang objek.
kd> dx -h Debugger.State
Debugger.State [State pertaining to the current execution of the debugger (e.g.: user variables)]
DebuggerVariables [Debugger variables which are owned by the debugger and can be referenced by a pseudo-register prefix of @$]
PseudoRegisters [Categorizied debugger managed pseudo-registers which can be referenced by a pseudo-register prefix of @$]
UserVariables [User variables which are maintained by the debugger and can be referenced by a pseudo-register prefix of @$]
Menampilkan informasi TEB dan PEB menggunakan objek Lingkungan
Gunakan objek Lingkungan untuk menampilkan informasi TEB dan PEB yang terkait dengan utas dan proses.
Untuk menampilkan TEB yang terkait dengan utas saat ini, gunakan perintah ini.
0: kd> dx -r2 @$curthread.Environment
@$curthread.Environment
EnvironmentBlock [Type: _TEB]
[+0x000] NtTib [Type: _NT_TIB]
[+0x038] EnvironmentPointer : Unable to read memory at Address 0x38
[+0x040] ClientId [Type: _CLIENT_ID]
[+0x050] ActiveRpcHandle : Unable to read memory at Address 0x50
[+0x058] ThreadLocalStoragePointer : Unable to read memory at Address 0x58
[+0x060] ProcessEnvironmentBlock : Unable to read memory at Address 0x60
[+0x068] LastErrorValue : Unable to read memory at Address 0x68
[+0x06c] CountOfOwnedCriticalSections : Unable to read memory at Address 0x6c
[+0x070] CsrClientThread : Unable to read memory at Address 0x70
[+0x078] Win32ThreadInfo : Unable to read memory at Address 0x78
[+0x080] User32Reserved [Type: unsigned long [26]]
[+0x0e8] UserReserved [Type: unsigned long [5]]
[+0x100] WOW32Reserved : Unable to read memory at Address 0x100
[+0x108] CurrentLocale : Unable to read memory at Address 0x108
[+0x10c] FpSoftwareStatusRegister : Unable to read memory at Address 0x10c
...
Untuk menampilkan PEB yang terkait dengan proses saat ini, gunakan perintah ini.
0: kd> dx -r2 @$curprocess.Environment
@$curprocess.Environment
EnvironmentBlock [Type: _PEB]
[+0x000] InheritedAddressSpace : Unable to read memory at Address 0x0
[+0x001] ReadImageFileExecOptions : Unable to read memory at Address 0x1
[+0x002] BeingDebugged : Unable to read memory at Address 0x2
[+0x003] BitField : Unable to read memory at Address 0x3
[+0x003 ( 0: 0)] ImageUsesLargePages : Unable to read memory at Address 0x3
[+0x003 ( 1: 1)] IsProtectedProcess : Unable to read memory at Address 0x3
[+0x003 ( 2: 2)] IsImageDynamicallyRelocated : Unable to read memory at Address 0x3
[+0x003 ( 3: 3)] SkipPatchingUser32Forwarders : Unable to read memory at Address 0x3
[+0x003 ( 4: 4)] IsPackagedProcess : Unable to read memory at Address 0x3
[+0x003 ( 5: 5)] IsAppContainer : Unable to read memory at Address 0x3
[+0x003 ( 6: 6)] IsProtectedProcessLight : Unable to read memory at Address 0x3
[+0x003 ( 7: 7)] IsLongPathAwareProcess : Unable to read memory at Address 0x3
[+0x004] Padding0 [Type: unsigned char [4]]
[+0x008] Mutant : Unable to read memory at Address 0x8
[+0x010] ImageBaseAddress : Unable to read memory at Address 0x10
[+0x018] Ldr : Unable to read memory at Address 0x18
[+0x020] ProcessParameters : Unable to read memory at Address 0x20
...
Objek Kernel Io.Handles
Gunakan objek Io.Handles proses saat ini untuk menampilkan informasi handel kernel.
0: kd> dx -r1 @$curprocess.Io.Handles
@$curprocess.Io.Handles
[0x8]
[0xc]
[0x10]
[0x14]
[0x18]
...
Gunakan . Fungsi First() untuk menampilkan informasi tentang handel pertama.
0: kd> dx -r2 @$curprocess.Io.Handles.First()
@$curprocess.Io.Handles.First()
Handle : 0x8
Type : Unexpected failure to dereference object
GrantedAccess : Unexpected failure to dereference object
Object [Type: _OBJECT_HEADER]
[+0x000] PointerCount : 228806 [Type: __int64]
[+0x008] HandleCount : 6 [Type: __int64]
[+0x008] NextToFree : 0x6 [Type: void *]
[+0x010] Lock [Type: _EX_PUSH_LOCK]
[+0x018] TypeIndex : 0xf2 [Type: unsigned char]
[+0x019] TraceFlags : 0x0 [Type: unsigned char]
[+0x019 ( 0: 0)] DbgRefTrace : 0x0 [Type: unsigned char]
[+0x019 ( 1: 1)] DbgTracePermanent : 0x0 [Type: unsigned char]
[+0x01a] InfoMask : 0x0 [Type: unsigned char]
[+0x01b] Flags : 0x2 [Type: unsigned char]
[+0x01b ( 0: 0)] NewObject : 0x0 [Type: unsigned char]
[+0x01b ( 1: 1)] KernelObject : 0x1 [Type: unsigned char]
[+0x01b ( 2: 2)] KernelOnlyAccess : 0x0 [Type: unsigned char]
[+0x01b ( 3: 3)] ExclusiveObject : 0x0 [Type: unsigned char]
[+0x01b ( 4: 4)] PermanentObject : 0x0 [Type: unsigned char]
[+0x01b ( 5: 5)] DefaultSecurityQuota : 0x0 [Type: unsigned char]
[+0x01b ( 6: 6)] SingleHandleEntry : 0x0 [Type: unsigned char]
[+0x01b ( 7: 7)] DeletedInline : 0x0 [Type: unsigned char]
[+0x01c] Reserved : 0x0 [Type: unsigned long]
[+0x020] ObjectCreateInfo : 0xfffff801f6d9c6c0 [Type: _OBJECT_CREATE_INFORMATION *]
[+0x020] QuotaBlockCharged : 0xfffff801f6d9c6c0 [Type: void *]
[+0x028] SecurityDescriptor : 0xffffb984aa815d06 [Type: void *]
[+0x030] Body [Type: _QUAD]
ObjectType : Unexpected failure to dereference object
UnderlyingObject : Unexpected failure to dereference object
Perhatikan bahwa objek Io.Handles adalah objek kernel saja.
Mengatasi batasan file simbol dengan transmisi
Saat menampilkan informasi tentang berbagai variabel sistem Windows, ada kalanya tidak semua informasi jenis tersedia di simbol publik. Contoh ini menggambarkan situasi ini.
0: kd> dx nt!PsIdleProcess
Error: No type (or void) for object at Address 0xfffff800e1d50128
Perintah dx mendukung kemampuan untuk mereferensikan alamat variabel yang tidak memiliki informasi jenis. Referensi "alamat" tersebut diperlakukan sebagai "batal *" dan dapat dilemparkan seperti itu. Ini berarti bahwa jika jenis data diketahui, sintaks berikut dapat digunakan untuk menampilkan informasi jenis untuk variabel.
dx (Datatype *)&VariableName
Misalnya untuk nt! PsIdleProcess yang memiliki tipe data nt!_EPROCESS, gunakan perintah ini.
dx (nt!_EPROCESS *)&nt!PsIdleProcess
(nt!_EPROCESS *)&nt!PsIdleProcess : 0xfffff800e1d50128 [Type: _EPROCESS *]
[+0x000] Pcb [Type: _KPROCESS]
[+0x2c8] ProcessLock [Type: _EX_PUSH_LOCK]
[+0x2d0] CreateTime : {4160749568} [Type: _LARGE_INTEGER]
[+0x2d8] RundownProtect [Type: _EX_RUNDOWN_REF]
[+0x2e0] UniqueProcessId : 0x1000 [Type: void *]
[+0x2e8] ActiveProcessLinks [Type: _LIST_ENTRY]
[+0x2f8] Flags2 : 0x218230 [Type: unsigned long]
[+0x2f8 ( 0: 0)] JobNotReallyActive : 0x0 [Type: unsigned long]
Perintah dx tidak mendukung pengalihan evaluator ekspresi dengan sintaks @@ MASM. Untuk informasi selengkapnya tentang evaluator ekspresi, lihat Mengevaluasi Ekspresi.
Menggunakan LINQ Dengan objek debugger
Sintaks LINQ dapat digunakan dengan objek debugger untuk mencari dan memanipulasi data. LINQ secara konseptual mirip dengan Bahasa Permintaan Terstruktur (SQL) yang digunakan untuk mengkueri database. Anda dapat menggunakan sejumlah metode LINQ untuk mencari, memfilter, dan mengurai data debug. Untuk informasi kami menggunakan LINQ dengan objek debugger, lihat Menggunakan LINQ Dengan objek debugger.
Menggunakan objek debugger dengan NatVis dan JavaScript
Untuk informasi tentang menggunakan objek debugger dengan NatVis, lihat Objek Debugger Asli di NatVis.
Untuk informasi tentang menggunakan objek debugger dengan JavaScript, lihat Objek Debugger Asli di Ekstensi JavaScript.
Lihat juga
Menggunakan LINQ Dengan objek debugger
Objek Debugger Asli di Ekstensi JavaScript
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk