dt (Jenis Tampilan)

Perintah dt menampilkan informasi tentang variabel lokal, variabel global, atau jenis data. Ini dapat menampilkan informasi tentang jenis data sederhana, serta struktur dan penyatuan.

Sintaks User-Mode

dt [-DisplayOpts] [-SearchOpts] [module!]Name [[-SearchOpts] Field] [Address] [-l List] 
dt [-DisplayOpts] Address [-l List] 
dt -h 

Sintaks Kernel-Mode

[Processor] dt [-DisplayOpts] [-SearchOpts] [module!]Name [[-SearchOpts] Field] [Address] [-l List] 
dt [-DisplayOpts] Address [-l List] 
dt -h 

Parameter

Prosesor
Menentukan prosesor yang menjalankan proses yang berisi informasi yang diperlukan. Untuk informasi selengkapnya, lihat Sintaks Multiproscessor. Prosesor hanya dapat ditentukan dalam mode kernel.

DisplayOpts
Menentukan satu atau beberapa opsi yang diberikan dalam tabel berikut ini. Opsi ini didahului oleh tanda hubung.

Opsi Deskripsi

-a[kuantitas]

Tampilkan setiap elemen array pada baris baru, dengan indeksnya. Total elemen kuantitas akan ditampilkan. Tidak boleh ada ruang antara a dan kuantitas. Jika -a tidak diikuti oleh digit, semua item dalam array ditampilkan. Sakelar -a[kuantitas] akan segera muncul sebelum setiap nama jenis atau nama bidang yang ingin Anda tampilkan dengan cara ini.

-B

Tampilkan blok secara rekursif. Jika struktur yang ditampilkan berisi substruktur, struktur diperluas secara rekursif ke kedalaman arbitrer dan ditampilkan secara penuh. Pointer diperluas hanya jika berada dalam struktur asli, bukan dalam substruktur.

-C

Output ringkas. Semua bidang ditampilkan pada satu baris, jika memungkinkan. (Saat digunakan dengan sakelar -a , setiap elemen array mengambil satu baris daripada diformat sebagai blok beberapa baris.)

-d

Saat digunakan dengan Nama yang diakhir dengan tanda bintang, tampilkan output verbose untuk semua jenis yang dimulai dengan Nama. Jika Nama tidak diakhir dengan tanda bintang, tampilkan output verbose.

-E

Memaksa dt untuk menghitung jenis. Opsi ini hanya diperlukan jika dt salah menginterpretasikan nilai Nama sebagai instans daripada sebagai jenis.

-i

Jangan inden subjenis.

-O

Hilangkan nilai offset dari bidang struktur.

-P

Alamat adalah alamat fisik, bukan alamat virtual.

-r[kedalaman]

Secara rekursif membuang bidang subjenis. Jika kedalaman diberikan, rekursi ini akan berhenti setelah tingkat kedalaman . Kedalaman harus berupa digit antara 1 dan 9, dan tidak boleh ada ruang antara r dan kedalaman. Tombol -r[depth] akan muncul segera sebelum alamat.

-sukuran

Hitung hanya jenis yang ukurannya dalam byte sama dengan nilai ukuran. Opsi -s hanya berguna ketika jenis sedang dijumlahkan. Ketika -s ditentukan, -e selalu tersirat juga.

-T

Hitung jenis saja.

-v

Output verbose. Ini memberikan informasi tambahan seperti ukuran total struktur dan jumlah elemennya. Ketika ini digunakan bersama dengan opsi pencarian -y , semua simbol ditampilkan, bahkan simbol tanpa informasi jenis terkait.

SearchOpts
Menentukan satu atau beberapa opsi yang diberikan dalam tabel berikut ini. Opsi ini didahului oleh tanda hubung.

Opsi Deskripsi

-n

Ini menunjukkan bahwa parameter berikutnya adalah nama. Ini harus digunakan jika item berikutnya sepenuhnya terdiri dari karakter heksadesimal, karena sebaliknya akan diambil sebagai alamat.

-Y

Ini menunjukkan bahwa parameter berikutnya adalah awal dari nama, belum tentu seluruh nama. Ketika -y disertakan, semua kecocokan dicantumkan, diikuti oleh informasi terperinci pada kecocokan pertama dalam daftar. Jika -y tidak disertakan, hanya kecocokan persis yang akan ditampilkan.

Modul
Parameter opsional yang menentukan modul yang menentukan struktur ini. Jika ada variabel atau jenis lokal dengan nama yang sama dengan variabel atau jenis global, Anda harus menyertakan modul untuk menentukan bahwa Anda berarti variabel global. Jika tidak, perintah dt akan menampilkan variabel lokal, bahkan jika variabel lokal adalah kecocokan yang tidak peka huruf besar/kecil dan variabel global adalah kecocokan peka huruf besar/kecil.

Nama
Menentukan nama jenis atau variabel global. Jika Nama berakhir dengan tanda bintang (*), daftar semua kecocokan akan ditampilkan. Dengan demikian, dt A\* akan mencantumkan semua jenis data, global, dan statis yang dimulai dengan "A", tetapi tidak akan menampilkan instans aktual dari jenis ini. (Jika opsi tampilan -v digunakan pada saat yang sama, semua simbol akan ditampilkan -- bukan hanya yang memiliki informasi jenis terkait.) Anda juga dapat mengganti Nama dengan titik (.) untuk menandakan bahwa Anda ingin mengulangi nilai Nama yang terakhir digunakan.

Jika Nama berisi spasi, nama tersebut harus diapit dalam tanda kurung.

Bidang
Menentukan bidang yang akan ditampilkan. Jika Bidang dihilangkan, semua bidang ditampilkan. Jika Bidang diikuti oleh titik (.), subbidang tingkat pertama bidang ini juga akan ditampilkan. Jika Bidang diikuti dengan serangkaian periode, subbidang akan ditampilkan ke kedalaman yang sama dengan jumlah periode. Nama bidang apa pun yang diikuti oleh titik akan diperlakukan sebagai kecocokan awalan, seolah-olah opsi pencarian -y digunakan. Jika Bidang diikuti oleh tanda bintang (*), bidang tersebut hanya diperlakukan sebagai awal bidang, belum tentu seluruh bidang, dan semua bidang yang cocok ditampilkan.

Alamat
Menentukan alamat struktur yang akan ditampilkan. Jika Nama dihilangkan, Alamat harus disertakan dan harus menentukan alamat variabel global. Alamat diambil untuk menjadi alamat virtual kecuali ditentukan lain. Gunakan opsi -p untuk menentukan alamat fisik. Gunakan tanda "at" ( @ ) untuk menentukan register (misalnya, @eax).

Daftar
Menentukan nama bidang yang menautkan daftar tertaut. Parameter Alamat harus disertakan.

Lingkungan

Item Deskripsi
Mode Mode pengguna, mode kernel
Target Live, crash dump
Platform Semua

Informasi Tambahan

Untuk gambaran umum manipulasi memori dan deskripsi perintah terkait memori lainnya, lihat Membaca dan Menulis Memori.

Keterangan

Output perintah dt akan selalu menampilkan angka yang ditandatangani di basis 10, dan angka yang tidak ditandatangani dalam heksadesimal.

Semua parameter dt yang memungkinkan nilai simbol juga memungkinkan wildcard string. Lihat Sintaks Wildcard String untuk detailnya.

Opsi -y dan -n dapat mendahului Nama atau Bidang apa pun. Opsi -y memungkinkan Anda menentukan awal jenis atau nama struktur. Misalnya, dt -y ALLEN akan menampilkan data tentang jenis ALLENTOWN. Namun, Anda tidak dapat menampilkan tipe ALLENTOWN dengan dt -y A. Sebaliknya, Anda harus menggunakan dt -ny A, karena A adalah nilai heksadesimal yang valid dan akan ditafsirkan sebagai alamat tanpa opsi -n .

Jika Nama menunjukkan struktur, semua bidang akan ditampilkan (misalnya, dt myStruct). Jika Anda hanya ingin satu bidang tertentu, Anda dapat melakukan dt myStruct myField. Ini menampilkan anggota yang akan disebut C myStruct.myField. Namun, perhatikan bahwa perintah dt myStruct myField1 myField2 menampilkan myStruct.myField1 dan myStruct.myField2. Ini tidak menampilkan myStruct.myField1.myField2.

Jika nama struktur atau bidang diikuti oleh subskrip, ini menentukan satu instans array. Misalnya, dt myStruct myFieldArray[3] akan menampilkan elemen keempat dari array yang dimaksud. Tetapi jika nama jenis diikuti oleh subskrip, ini menentukan seluruh array. Misalnya, dt CHAR[8] myPtr akan menampilkan string delapan karakter. Subskrip selalu diambil sebagai desimal terlepas dari radiks saat ini; awalan 0x akan menyebabkan kesalahan.

Karena perintah menggunakan informasi jenis dari . file pdb , dapat digunakan secara bebas untuk men-debug platform CPU apa pun.

Informasi jenis yang digunakan oleh dt mencakup semua nama jenis yang dibuat dengan typedef, termasuk semua jenis yang ditentukan Windows. Misalnya, panjang dan karakteryang tidak ditandatangani bukan nama jenis yang valid, tetapi ULONG dan CHAR adalah. Lihat Microsoft Windows SDK untuk daftar lengkap semua nama jenis Windows.

Semua jenis yang dibuat oleh typedefs dalam kode Anda sendiri akan ada, selama jenis tersebut benar-benar telah digunakan dalam program Anda. Namun, jenis yang ditentukan di header Anda tetapi tidak pernah benar-benar digunakan tidak akan disimpan dalam file simbol .pdb dan tidak akan dapat diakses oleh debugger. Untuk membuat jenis seperti itu tersedia untuk debugger, gunakan sebagai input pernyataan typedef . Misalnya, jika berikut ini muncul dalam kode Anda, struktur MY_DATA akan disimpan dalam file simbol .pdb dan dapat ditampilkan oleh perintah dt :

typedef struct _MY_DATA {
    . . .
    } MY_DATA;
typedef  MY_DATA *PMY_DATA; 

Di sisi lain, kode berikut tidak akan cukup karena MY_DATA dan PMY_DATA didefinisikan oleh typedef awal dan, oleh karena itu, MY_DATA belum digunakan sebagai input dari pernyataan typedef apa pun:

typedef struct _MY_DATA {
    . . .
    } MY_DATA, *PMY_DATA; 

Dalam peristiwa apa pun, informasi jenis hanya disertakan dalam file simbol lengkap, bukan file simbol yang telah dilucuti dari semua informasi simbol privat. Untuk informasi selengkapnya, lihat Simbol Publik dan Privat.

Jika Anda ingin menampilkan string unicode, Anda perlu menggunakan perintah .enable_unicode (Aktifkan Tampilan Unicode) terlebih dahulu. Anda dapat mengontrol tampilan bilangan bulat panjang dengan perintah .enable_long_status (Aktifkan Tampilan Bilangan Bulat Panjang).

Dalam contoh berikut, dt menampilkan variabel global:

0:000> dt mt1 
   +0x000 a                : 10
   +0x004 b                : 98 'b'
   +0x006 c                : 0xdd
   +0x008 d                : 0xabcd
   +0x00c gn               : [6] 0x1
   +0x024 ex               : 0x0 

Dalam contoh berikut, dt menampilkan gn bidang array:

0:000> dt mt1 -a gn 
   +0x00c gn : 
    [00] 0x1
    [01] 0x2
    [02] 0x3
    [03] 0x4
    [04] 0x5
    [05] 0x6 

Perintah berikut menampilkan beberapa subbidang variabel:

0:000> dt mcl1 m_t1 dpo 
   +0x010 dpo  : DEEP_ONE
   +0x070 m_t1 : MYTYPE1 

Perintah berikut menampilkan subbidang bidang m_t1. Karena periode secara otomatis menyebabkan pencocokan awalan, ini juga akan menampilkan subbidang bidang apa pun yang dimulai dengan "m_t1":

0:000> dt mcl1 m_t1. 
   +0x070 m_t1  : 
      +0x000 a     : 0
      +0x004 b     : 0 '
      +0x006 c     : 0x0
      +0x008 d     : 0x0
      +0x00c gn    : [6] 0x0
      +0x024 ex    : 0x0 

Anda bisa mengulangi ini untuk setiap kedalaman. Misalnya, perintah dt mcl1 a.. c. akan menampilkan semua bidang ke kedalaman empat, sehingga nama bidang pertama dimulai dengan dan nama bidang ketiga dimulai dengan c.

Berikut adalah contoh yang lebih rinci tentang bagaimana subbidang dapat ditampilkan. Pertama, tampilkan bidang Ldr :

0:000> dt nt!_PEB Ldr 7ffdf000 
   +0x00c Ldr : 0x00191ea0 

Sekarang perluas bidang jenis penunjuk:

0:000> dt nt!_PEB Ldr Ldr. 7ffdf000 
   +0x00c Ldr  : 0x00191ea0
      +0x000 Length : 0x28
      +0x004 Initialized : 0x1 '
      +0x008 SsHandle : (null)
      +0x00c InLoadOrderModuleList : _LIST_ENTRY [ 0x191ee0 - 0x192848 ]
      +0x014 InMemoryOrderModuleList : _LIST_ENTRY [ 0x191ee8 - 0x192850 ]
      +0x01c InInitializationOrderModuleList : _LIST_ENTRY [ 0x191f58 - 0x192858 ]
      +0x024 EntryInProgress : (null) 

Sekarang tampilkan bidang CriticalSectionTimeout :

0:000> dt nt!_PEB CriticalSectionTimeout 7ffdf000 
   +0x070 CriticalSectionTimeout : _LARGE_INTEGER 0xffffe86d`079b8000 

Sekarang perluas subbidang struktur CriticalSectionTimeout satu tingkat kedalaman:

0:000> dt nt!_PEB CriticalSectionTimeout. 7ffdf000 
   +0x070 CriticalSectionTimeout  :  0xffffe86d`079b8000
      +0x000 LowPart                 : 0x79b8000
      +0x004 HighPart                : -6035
      +0x000 u                       : __unnamed
      +0x000 QuadPart                : -25920000000000 

Sekarang perluas struktur CriticalSectionTimeout subbidang dua tingkat kedalaman:

0:000> dt nt!_PEB CriticalSectionTimeout.. 7ffdf000 
   +0x070 CriticalSectionTimeout   :  0xffffe86d`079b8000
      +0x000 LowPart                  : 0x79b8000
      +0x004 HighPart                 : -6035
      +0x000 u                        :
         +0x000 LowPart                  : 0x79b8000
         +0x004 HighPart                 : -6035
      +0x000 QuadPart                 : -25920000000000 

Perintah berikut menampilkan instans jenis data MYTYPE1 yang terletak di alamat 0x0100297C:

0:000> dt 0x0100297c MYTYPE1 
   +0x000 a                : 22
   +0x004 b                : 43 '+'
   +0x006 c                : 0x0
   +0x008 d                : 0x0
   +0x00c gn               : [6] 0x0
   +0x024 ex               : 0x0 

Perintah berikut menampilkan array 10 ULONG di alamat 0x01002BE0:

0:000> dt -ca10 ULONG 01002be0 
[0] 0x1001098
[1] 0x1
[2] 0xdead
[3] 0x7d0
[4] 0x1
[5] 0xcd
[6] 0x0
[7] 0x0
[8] 0x0
[9] 0x0 

Perintah berikut melanjutkan tampilan sebelumnya di alamat yang berbeda. Perhatikan bahwa "ULONG" tidak perlu dimasukkan kembali:

0:000> dt -ca4 . 01002d00 
Using sym ULONG
[0] 0x12
[1] 0x4ac
[2] 0xbadfeed
[3] 0x2 

Berikut adalah beberapa contoh tampilan jenis. Perintah berikut menampilkan semua jenis dan global yang dimulai dengan string "MY" dalam modul thismodule. Yang diawali dengan alamat adalah instans aktual; yang tanpa alamat adalah definisi jenis:

0:000> dt thismodule!MY* 
010029b8  thismodule!myglobal1
01002990  thismodule!myglobal2
          thismodule!MYCLASS1
          thismodule!MYCLASS2
          thismodule!MYCLASS3
          thismodule!MYTYPE3::u
          thismodule!MYTYPE1
          thismodule!MYTYPE3
          thismodule!MYTYPE3
          thismodule!MYFLAGS 

Saat melakukan tampilan tipe, opsi -v dapat digunakan untuk menampilkan ukuran setiap item. Opsi ukuran -s hanya dapat digunakan untuk menghitung item dengan ukuran tertentu. Sekali lagi, yang diawali dengan alamat adalah instans aktual; yang tanpa alamat adalah definisi jenis:

0:001> dt -s 2 -v thismodule!* 
Enumerating symbols matching thismodule!*, Size = 0x2
Address   Size Symbol
           002 thismodule!wchar_t
           002 thismodule!WORD
           002 thismodule!USHORT
           002 thismodule!SHORT
           002 thismodule!u_short
           002 thismodule!WCHAR
00427a34   002 thismodule!numberOfShips
00427a32   002 thismodule!numberOfPlanes
00427a30   002 thismodule!totalNumberOfItems 

Berikut adalah contoh opsi -b . Struktur diperluas dan array OwnerThreads dalam struktur diperluas, tetapi penunjuk daftar Flink dan Blink tidak diikuti:

kd> dt nt!_ERESOURCE -b 0x8154f040 
   +0x000 SystemResourcesList :  [ 0x815bb388 - 0x816cd478 ]
      +0x000 Flink            : 0x815bb388
      +0x004 Blink            : 0x816cd478
   +0x008 OwnerTable       : (null)
   +0x00c ActiveCount      : 1
   +0x00e Flag             : 8
   +0x010 SharedWaiters    : (null)
   +0x014 ExclusiveWaiters : (null)
   +0x018 OwnerThreads     :
    [00]
      +0x000 OwnerThread      : 0
      +0x004 OwnerCount       : 0
      +0x004 TableSize        : 0
    [01]
      +0x000 OwnerThread      : 0x8167f563
      +0x004 OwnerCount       : 1
      +0x004 TableSize        : 1
   +0x028 ContentionCount  : 0
   +0x02c NumberOfSharedWaiters : 0
   +0x02e NumberOfExclusiveWaiters : 0
   +0x030 Address          : (null)
   +0x030 CreatorBackTraceIndex : 0
   +0x034 SpinLock         : 0

Berikut adalah contoh dt dalam mode kernel. Perintah berikut menghasilkan hasil yang mirip dengan !process 0 0:

kd> dt nt!_EPROCESS -l ActiveProcessLinks.Flink -y Ima -yoi Uni 814856f0 
## ActiveProcessLinks.Flink at 0x814856f0

UniqueProcessId : 0x00000008
ImageFileName : [16] "System"

## ActiveProcessLinks.Flink at 0x8138a030

UniqueProcessId : 0x00000084
ImageFileName : [16] "smss.exe"

## ActiveProcessLinks.Flink at 0x81372368

UniqueProcessId : 0x000000a0
ImageFileName : [16] "csrss.exe"

## ActiveProcessLinks.Flink at 0x81369930

UniqueProcessId : 0x000000b4
ImageFileName : [16] "winlogon.exe"

.... 

Jika Anda ingin menjalankan perintah untuk setiap elemen daftar, gunakan ekstensi !list .

Terakhir, perintah dt -h akan menampilkan teks bantuan singkat yang meringkas sintaks dt .