共用方式為


dt (顯示類型)

dt命令會顯示區域變數、全域變數或資料類型的相關資訊。 這可以顯示單一資料型別的相關資訊,以及結構和等位。

User-Mode 語法

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

Kernel-Mode 語法

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

參數

處理器
指定執行包含所需資訊的處理常式的處理器。 如需詳細資訊,請參閱 多處理器語法。 處理器只能在核心模式中指定。

DisplayOpts
指定下表中提供的一或多個選項。 這些選項前面會加上連字號。

選項 Description

-a[quantity]

在新行上顯示每個陣列元素及其索引。 將會顯示 數量 專案總數。 與數量之間不得有空格。 如果 -a 後面沒有數位,則會顯示陣列中的所有專案。 -a[quantity] 參數應該緊接在您想要以這種方式顯示的每個類型名稱或功能變數名稱之前。

-b

以遞迴方式顯示區塊。 如果顯示的結構包含子結構,則會以遞迴方式擴充為任意深度,並完整顯示。 只有在指標位於原始結構中,而不是在子結構中時,才會展開。

-c

壓縮輸出。 如果可能的話,所有欄位都會顯示在一行上。 (搭配 -a 參數使用時,每個陣列元素會採用一行,而不是格式化為數行區塊。)

-d

搭配以星號結束的 Name 搭配使用時,請針對以 Name開頭的所有類型顯示詳細資訊輸出。 如果 Name 未以星號結尾,則顯示詳細資訊輸出。

-e

強制 dt 列舉型別。 只有在 dt 錯誤地將 Name 值解譯為實例而非類型時,才需要這個選項。

-i

請勿縮排子類型。

-o

省略結構欄位的位移值。

-p

位址 是實體位址,而不是虛擬位址。

-r[depth]

以遞迴方式傾印子類型欄位。 如果指定 深度 ,此遞迴會在 深度 層級之後停止。 深度必須是介於 1 到 9 之間的數位,且 r深度之間不得有空格。 -r[depth] 參數應該緊接在位址之前。

-s大小

只列舉以位元組為單位的大小等於 size值的型別。 只有在列舉型別時, -s 選項才有用。 指定 -s 時,一律也會隱含 -e

-t

僅列舉型別。

-v

詳細資訊輸出。 這可提供其他資訊,例如結構的大小總計和其元素的數目。 當這與 -y 搜尋選項搭配使用時,所有符號都會顯示,即使沒有相關聯的類型資訊也一致。

SearchOpts
指定下表中提供的一或多個選項。 這些選項前面會加上連字號。

選項 描述

-n

這表示下一個參數是名稱。 如果下一個專案包含完全十六進位字元,就應該使用此專案,因為它會被視為位址。

-Y

這表示下一個參數是名稱的開頭,不一定是整個名稱。 包含 -y時,會列出所有相符專案,後面接著清單中第一個相符專案的詳細資訊。 如果未包含 -y ,則只會顯示完全相符專案。

模組
選擇性參數,指定定義此結構的模組。 如果區域變數或類型的名稱與全域變數或類型相同,您應該包含 模組 來指定表示全域變數。 否則, dt 命令會顯示區域變數,即使區域變數不區分大小寫的相符專案,而且全域變數是區分大小寫的相符專案也一樣。

名字
指定型別或全域變數的名稱。 如果 Name 以星號結尾 (*) ,則會顯示所有相符專案的清單。 因此, dt A\* 會列出以 「A」 開頭的所有資料類型、全域和靜態,但不會顯示這些類型的實際實例。 (如果同時使用-v顯示選項,則會顯示所有符號,而不只是具有相關聯類型資訊的符號。) 您也可以Name取代為句點 (。) 表示您想要重複最近使用 Name 的值

如果 Name 包含空格,它應該以括弧括住。

領域
指定要顯示的欄位 () 。 如果省略 Field ,則會顯示所有欄位。 如果 Field 後面接著句點 () ,也會顯示此欄位的第一層子欄位。 如果 Field 後面接著一系列句點,子欄位會顯示為等於句點數目的深度。 後面接著句號的任何功能變數名稱都會被視為前置詞相符專案,就像使用 -y 搜尋選項一樣。 如果 Field 後面接著星號 (*) ,它只會被視為欄位的開頭,不一定是整個欄位,而且會顯示所有相符的欄位。

位址
指定要顯示之結構的位址。 如果省略 Name ,則必須包含 Address ,而且必須指定全域變數的位址。 除非另有指定,否則會將位址視為虛擬位址。 使用 -p 選項來指定實體位址。 使用 「at」 符號 ( @ ) 來指定註冊 (,例如 @eax) 。

清單
指定連結清單的功能變數名稱。 必須包含 Address 參數。

環境

項目 描述
模式 使用者模式、核心模式
目標 即時、損毀傾印
平台 全部

其他資訊

如需記憶體操作的概觀,以及其他記憶體相關命令的描述,請參閱 讀取和寫入記憶體

備註

dt命令輸出一律會在基底 10 中顯示帶正負號的數位,並以十六進位表示不帶正負號的數位。

允許符號值的所有 dt 參數也允許字串萬用字元。 如需詳細資訊 ,請參閱字串萬用字元語法

-y-n選項可以在任何[名稱] 或[欄位] 之前。 -y選項可讓您指定類型或結構名稱的開頭。 例如, dt -y ALLEN 會顯示 ALLENTOWN類型的相關資料。 不過,您無法使用dt -y A顯示ALLENTOWN類型。相反地,您必須使用dt -ny A,因為A是有效的十六進位值,而且會解譯為沒有-n選項的位址。

如果 Name 指出結構,則會 (顯示所有欄位,例如 dt myStruct) 。 如果您只想要一個特定欄位,您可以執行 dt myStruct myField。 這會顯示 C 會呼叫 myStruct.myField的成員。 不過,請注意 ,dt myStruct myField1 myField2 命令會顯示 myStruct.myField1myStruct.myField2。 它不會顯示 myStruct.myField1.myField2

如果結構名稱或欄位後面接著下標,這會指定陣列的單一實例。 例如, dt myStruct myFieldArray[3] 會顯示有問題的陣列第四個專案。 但是,如果類型名稱後面接著下標,這會指定整個陣列。 例如, dt CHAR[8] myPtr 會顯示八個字元字串。 不論目前的弧度為何,下標一律會採用為十進位; 0x 前置詞會導致錯誤。

因為 命令使用 來自 的類型資訊。pdb 檔案,可用來偵錯任何 CPU 平臺。

dt所使用的類型資訊包含使用typedef建立的所有類型名稱,包括所有 Windows 定義型別。 例如, 不帶正負號的 longchar 不是有效的類型名稱,但 ULONGCHAR 則為 。 如需所有 Windows 類型名稱的完整清單,請參閱Microsoft Windows SDK。

只要程式碼中實際使用 typedefs,所有由 typedefs 建立的類型都會存在。 不過,在標頭中定義的類型,但從未實際使用的類型不會儲存在 .pdb 符號檔中,而且偵錯工具將無法存取。 若要讓這類類型可供偵錯工具使用,請使用它作為typedef語句的輸入。 例如,如果下列專案出現在程式碼中,結構MY_DATA將會儲存在 .pdb 符號檔中,而且可由 dt 命令顯示:

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

另一方面,由於初始 typedef 定義MY_DATA和PMY_DATA,因此,MY_DATA本身並未作為任何 typedef 語句的輸入而已足夠:

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

在任何事件中,類型資訊只會包含在完整符號檔中,而不是已移除所有私人符號資訊的符號檔。 如需詳細資訊,請參閱 公用和私人符號

如果您想要顯示 unicode 字串,您必須先使用 [啟用 Unicode 顯示]) 命令.enable_unicode ( 。 您可以使用 .enable_long_status ([啟用長整數顯示) ] 命令,控制長整數的顯示。

在下列範例中, dt 會顯示全域變數:

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

在下列範例中, dt 會顯示陣列欄位 gn

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

下列命令會顯示變數的一些子欄位:

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

下列命令會顯示欄位的子欄位 m_t1。 由於期間會自動造成前置詞比對,因此也會顯示開頭為 「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 

您可以將此重複至任何深度。 例如, 命令 dt mcl1 a..c. 會以深度四顯示所有欄位,讓第一個功能變數名稱開頭為 a ,而第三個功能變數名稱開頭為 c

以下是如何顯示子欄位的更詳細範例。 首先,顯示 Ldr 欄位:

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

現在展開 [指標類型] 欄位:

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) 

現在顯示 [CriticalSectionTimeout ] 欄位:

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

現在展開 CriticalSectionTimeout 結構子欄位一層深度:

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

現在展開 CriticalSectionTimeout 結構子欄位兩個層級的深度:

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 

下列命令會顯示位於位址0x0100297C之資料類型MYTYPE1的實例:

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

下列命令會在位址0x01002BE0顯示 10 個 ULONG 的陣列:

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 

下列命令會繼續在不同位址上顯示先前的顯示。 請注意,不需要重新輸入 「ULONG」 :

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

以下是一些類型顯示範例。 下列命令會顯示本課程 模組中開頭為 「MY」 字串的所有類型和全域。 前面加上位址的實例是實際的實例;沒有位址的那些是類型定義:

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 

執行類型顯示時, 可以使用 -v 選項來顯示每個專案的大小。 -ssize選項只能用來列舉特定大小的專案。 同樣地,加上位址的前置詞是實際的實例;沒有位址的那些是類型定義:

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 

以下是 -b 選項的範例。 結構已展開,且結構內的 OwnerThreads 陣列已展開,但不會遵循 FlinkBlink 清單指標:

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

以下是核心模式中的 dt 範例。 下列命令會產生類似 !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"

.... 

如果您想要針對清單的每個元素執行命令,請使用 !list 延伸模組。

最後, dt -h 命令會顯示摘要 dt 語法的簡短解說文字。