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

Cuplikan layar output dari perintah dx -g @$curprocess.modules, menampilkan output kisi kolom.

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 NatVis

Objek Debugger Asli di Ekstensi JavaScript