WinDbg常用命令系列---顯示數據類型dt/dtx


dt (Display Type)

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 

參數:

  • Processor
    指定運行包含所需信息的進程的處理器。只能在內核模式下指定處理器。
  • DisplayOpts
    指定下表中給定的一個或多個選項。這些選項前面有連字符。
    Option 描述

    -a[quantity]

    帶有其索引的新行上顯示每個數組元素。 總共數量將顯示元素。 必須有之間沒有空格並quantity如果-a后面不接數字,該數組中的所有項所都示。 -A[quantity] 開關應出現立即每個類型名稱或字段名稱的前您想在這種方式中顯示。

    -b

    顯示基塊以遞歸方式。 如果顯示的結構包含子結構,它是以遞歸方式展開到任意深度和完整顯示。 僅當它們是不在子結構的原始結構中,指針會展開。

    -c

    壓縮輸出。 如有可能在同一行顯示所有字段。 (與一起使用時-a交換機,每個數組元素都占用一行,而不是格式為多個行塊。)

    -d

    與一起使用時名稱的已結束,但一個星號,顯示以開頭的所有類型的詳細輸出名稱如果名稱不以星號結尾,則顯示詳細輸出。

    -e

    強制dt枚舉類型。 如果僅需要此選項dt錯誤地解釋名稱實例而不是一種類型的值。

    -i

    不縮進子類型。

    -o

    省略結構字段的偏移量的值。

    -p

    地址是一個物理地址,而不是虛擬的地址。

    -r[depth]

    以遞歸方式轉儲的子類型字段。 如果深度是,此遞歸將停止后深度級別。 深度都必須是介於 1 和 9 之間的數字和必須之間沒有空格r深度-R[深度] 交換機應出現在立即之前地址。

    -s size

    僅這些中的類型的大小字節數等於的值枚舉大小-S正在枚舉類型時,選項才有用。 -s指定,則-e始終也暗示。

    -t

    枚舉僅適用於類型。

    -v

    詳細輸出。 這樣,例如總大小的結構和它的元素數的其他信息。 這用於時沿-y搜索選項,將顯示所有符號,甚至包括那些沒有關聯的類型信息。


  • SearchOpts
    指定下表中給定的一個或多個選項。這些選項前面有連字符。
    Option 描述

    -n

    這表示下一個參數是一個名稱。 這應在下一項完全十六進制字符組成,因為它否則將執行作為一個地址。

    -y

    這指示下一個參數的名稱,不一定是整個名稱開頭。 -y是包含,所有列出了匹配項,然后上列表中的第一個匹配項的詳細信息。 如果-y是未包含,就會顯示僅完全匹配項。

  • module
    指定定義此結構的模塊的可選參數。如果存在與全局變量或類型同名的局部變量或類型,則應包含模塊以指定您是指全局變量。否則,dt命令將顯示局部變量,即使局部變量是不區分大小寫的匹配,而全局變量是區分大小寫的匹配。
  • Name

    指定類型或全局變量的名稱。如果名稱以星號(*)結尾,將顯示所有匹配項的列表。因此,dt a*將列出以“a”開頭的所有數據類型、全局和靜態,但不會顯示這些類型的實際實例。(如果同時使用-v display選項,則將顯示所有符號,而不僅僅是具有相關類型信息的符號。)您還可以用句點(.)替換名稱,以表示您要重復最近使用的名稱值。如果名稱包含空格,則應將其括在括號中。

  • Field
    指定要顯示的字段。如果省略字段,則顯示所有字段。如果字段后跟句點(),則也將顯示此字段的第一級子字段。如果字段后面跟着一系列句點,子字段的顯示深度將等於句點數。任何后跟句點的字段名都將被視為前綴匹配,就好像使用了-y搜索選項一樣。如果字段后跟星號(*),則它僅被視為字段的開頭,而不一定是整個字段,並且將顯示所有匹配的字段。
  • Address
    指定要顯示的結構的地址。如果省略了名稱,則必須包含地址,並且必須指定全局變量的地址。除非另有說明,否則地址被視為虛擬地址。使用-p選項指定物理地址。使用“at”符號(@)指定寄存器(例如@eax)。
  • List
    指定鏈接鏈接列表的字段名。必須包含address參數。

dt命令輸出將始終以10為基數顯示有符號數字,以十六進制顯示無符號數字。所有允許符號值的dt參數也允許字符串通配符。 --y和-n選項可以位於任何名稱或字段之前。-y選項允許您指定類型或結構名稱的開頭。例如,dt-y allen將顯示關於allentown類型的數據。但是,不能使用dt-y a顯示allentown類型。相反,必須使用dt-ny a,因為a是有效的十六進制值,並且將被解釋為不帶-n選項的地址。如果名稱表示結構,則將顯示所有字段(例如,dt mystrut)。如果只需要一個特定字段,可以執行dt mystrut myfield。這將顯示C將調用mystrut.myfield的成員。但是,請注意,命令dt mystrut myfield1 myfield2顯示mystrut.myfield1和mystrut.myfield2。它不顯示mystruct.myfield1.myfield2。如果結構名稱或字段后跟下標,則指定數組的單個實例。例如,dt mystrut myfieldarray[3]將顯示所討論數組的第四個元素。但是,如果類型名后跟下標,則指定整個數組。例如,dt char[8]myptr將顯示一個8個字符的字符串。不管當前的基數是多少,下標始終被視為十進制;一個0x前綴將導致錯誤。因為該命令使用來自.pdb文件的類型信息,所以它可以自由地用於調試任何CPU平台。dt使用的類型信息包括用typedef創建的所有類型名,包括所有Windows定義的類型。例如,無符號long和char不是有效的類型名,但ulong和char是。

由typedef在您自己的代碼中創建的所有類型都將出現,只要它們已經在您的程序中實際使用。但是,在頭文件中定義但從未實際使用的類型將不會存儲在.pdb符號文件中,調試器將無法訪問這些類型。要使此類類型對調試器可用,請將其用作typedef語句的輸入。例如,如果代碼中出現以下內容,則結構my_data將存儲在.pdb符號文件中,並可以通過dt命令顯示:

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

另一方面,以下代碼還不夠,因為MY_DATA和PMY_DATA都是由初始typedef定義的,因此,MY_DATA本身並沒有被用作任何typedef語句的輸入:

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

在任何情況下,類型信息只包含在完整的符號文件中,而不是從所有私有符號信息中刪除的符號文件。如果要顯示Unicode字符串,需要先使用.enable_unicode (Enable Unicode Display)命令。您可以使用.enable_long_status (Enable Long Integer Display)命令控制長整型的顯示。

在以下示例中,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...c。 將顯示所有字段深度四個,以便第一個字段名稱開頭和第三個字段名稱開頭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 ULONGs 數組:

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"開頭的全局thismodule這些帶有地址前綴是實際的實例;地址不是類型定義:

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 大小選項可用於僅枚舉具有特定大小的項。 同樣,這些前綴的地址是實際的實例;地址不是類型定義:

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閃爍未遵循列表的指針:

 
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"

.... 

dtx (Display Type - Extended Debugger Object Model Information)

dtx命令使用調試器對象模型顯示擴展符號類型信息。dtx命令類似於dt(顯示類型)命令。

dtx -DisplayOpts [Module!]Name Address

參數:

  • DisplayOpts

    使用以下可選標志更改輸出的顯示方式。

    -a 在新行中顯示數組元素及其索引。

    -r [n] 遞歸地將子類型(字段)轉儲到n個級別。

    -h 顯示命令行幫助。
  • Module!
    指定定義此結構的模塊的可選參數,后跟感嘆號。如果存在與全局變量或類型同名的局部變量或類型,則應包括模塊名以指定全局變量。

  • Name
    類型名或全局符號。
  • Address
    包含類型的內存地址。

下面的示例演示如何使用dtx命令。

使用地址和名稱顯示擴展符號類型信息。

0: kd> dtx nt!_EPROCESS ffffb607560b56c0
(*((nt!_EPROCESS *)0xffffb607560b56c0))                 [Type: _EPROCESS]
    [+0x000] Pcb              [Type: _KPROCESS]
    [+0x2d8] ProcessLock      [Type: _EX_PUSH_LOCK]
    [+0x2e0] RundownProtect   [Type: _EX_RUNDOWN_REF]
    [+0x2e8] UniqueProcessId  : 0x4 [Type: void *]
    [+0x2f0] ActiveProcessLinks [Type: _LIST_ENTRY]

使用-r遞歸選項顯示其他信息。

0: kd> dtx -r2 HdAudio!CAzMixertopoMiniport fffff806`d24992b8
(*((HdAudio!CAzMixertopoMiniport *)0xfffff806d24992b8))                 [Type: CAzMixertopoMiniport]
    [+0x018] m_lRefCount      : -766760880 [Type: long]
    [+0x020] m_pUnknownOuter  : 0xfffff806d24dbc40 [Type: IUnknown *]
    [+0x028] m_FilterDesc     [Type: PCFILTER_DESCRIPTOR]
        [+0x000] Version          : 0xd24c2890 [Type: unsigned long]
        [+0x008] AutomationTable  : 0xfffff806d24c2780 [Type: PCAUTOMATION_TABLE *]
            [+0x000] PropertyItemSize : 0x245c8948 [Type: unsigned long]
            [+0x004] PropertyCount    : 0x6c894808 [Type: unsigned long]
            [+0x008] Properties       : 0x5718247489481024 [Type: PCPROPERTY_ITEM *]
            [+0x010] MethodItemSize   : 0x55415441 [Type: unsigned long]
            [+0x014] MethodCount      : 0x57415641 [Type: unsigned long]
            [+0x018] Methods          : 0x4ce4334540ec8348 [Type: PCMETHOD_ITEM *]
            [+0x020] EventItemSize    : 0x8b41f18b [Type: unsigned long]
            [+0x024] EventCount       : 0xd8b48f4 [Type: unsigned long]
            [+0x028] Events           : 0x7d2d8d4cfffdf854 [Type: PCEVENT_ITEM *]
            [+0x030] Reserved         : 0x66fffd79 [Type: unsigned long]
        [+0x010] PinSize          : 0xd24aa9b0 [Type: unsigned long]
        [+0x014] PinCount         : 0xfffff806 [Type: unsigned long]
        [+0x018] Pins             : 0xfffff806d24aa740 [Type: PCPIN_DESCRIPTOR *]
            [+0x000] MaxGlobalInstanceCount : 0x57555340 [Type: unsigned long]
            [+0x004] MaxFilterInstanceCount : 0x83485741 [Type: unsigned long]
            [+0x008] MinFilterInstanceCount : 0x8b4848ec [Type: unsigned long]
            [+0x010] AutomationTable  : 0xa5158b48ed33c000 [Type: PCAUTOMATION_TABLE *]
            [+0x018] KsPinDescriptor  [Type: KSPIN_DESCRIPTOR]

使用x(檢查符號)命令顯示感興趣項的地址。

0: kd> x /d HdAudio!CazMixertopoMiniport*
...
fffff806`d24992b8 HdAudio!CAzMixertopoMiniport::`vftable' = <no type information>

 

 





 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM