共用方式為


dt (顯示類型)

dt 命令會顯示局部變數、全域變數或數據類型的相關信息。 這可以顯示簡單數據類型的相關信息,以及結構和等位。

使用者模式語法

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

內核模式語法

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

參數

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

DisplayOpts
指定下表中提供的一或多個選項。 這些選項前面有連字元。

選項 描述

-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 參數。

Environment

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

其他資訊

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

備註

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 字串,您必須先使用 .enable_unicode [啟用 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 選項來顯示每個專案的大小。 -s size 選項只能用來列舉特定大小的專案。 同樣地,加上位址的前置詞是實際實例;沒有位址的那些是類型定義:

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 陣列已展開,但 Flink 和 Blink 清單指標未遵循:

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 語法。