dt (Anzeigetyp)

Der Befehl dt zeigt Informationen zu einer lokalen Variablen, einer globalen Variablen oder einem Datentyp an. Dadurch können Informationen zu einfachen Datentypen sowie Strukturen und Unions angezeigt werden.

User-Mode Syntax

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

Kernel-Mode Syntax

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

Parameter

Prozessor
Gibt den Prozessor an, der den Prozess ausführt, der die erforderlichen Informationen enthält. Weitere Informationen finden Sie unter Multiprozessorsyntax. Prozessoren können nur im Kernelmodus angegeben werden.

DisplayOpts
Gibt eine oder mehrere der in der folgenden Tabelle angegebenen Optionen an. Diesen Optionen wird ein Bindestrich vorangestellt.

Option BESCHREIBUNG

-a[quantity]

Zeigen Sie jedes Arrayelement in einer neuen Zeile mit seinem Index an. Es wird eine Gesamtmenge von Mengenelementen angezeigt. Zwischen a und der Menge darf kein Leerzeichen vorhanden sein. Wenn auf -a keine Ziffer folgt, werden alle Elemente im Array angezeigt. Der Schalter -a[quantity] sollte unmittelbar vor jedem Typnamen oder Feldnamen angezeigt werden, der auf diese Weise angezeigt werden soll.

-b

Rekursiv anzeigen von Blöcken. Wenn eine angezeigte Struktur Unterstrukturen enthält, wird sie rekursiv auf beliebige Tiefen erweitert und vollständig angezeigt. Zeiger werden nur erweitert, wenn sie sich in der ursprünglichen Struktur befinden, nicht in Unterstrukturen.

-c

Kompakte Ausgabe. Alle Felder werden nach Möglichkeit in einer Zeile angezeigt. (Bei Verwendung mit dem Schalter -a nimmt jedes Arrayelement eine Zeile an, anstatt als mehrzeiligen Block formatiert zu werden.)

-d

Bei Verwendung mit einem Namen , der mit einem Sternchen beendet wird, wird eine ausführliche Ausgabe für alle Typen angezeigt, die mit Name beginnen. Wenn Name nicht mit einem Sternchen endet, wird die ausführliche Ausgabe angezeigt.

-e

Erzwingt dt , Typen aufzuzählen. Diese Option ist nur erforderlich, wenn dt den Name-Wert versehentlich als instance und nicht als Typ interpretiert.

-i

Die Untertypen nicht einziehen.

-o

Lassen Sie Offsetwerte der Strukturfelder aus.

-p

Die Adresse ist eine physische Adresse und keine virtuelle Adresse.

-r[tiefe]

Gibt die Untertypfelder rekursiv ab. Wenn Tiefe angegeben wird, wird diese Rekursion nach tiefen Ebenen beendet. Die Tiefe muss eine Ziffer zwischen 1 und 9 sein, und zwischen r und der Tiefe darf kein Abstand vorhanden sein. Der Schalter -r[depth] sollte unmittelbar vor der Adresse angezeigt werden.

-sgröße

Listet nur die Typen auf, deren Größe in Bytes dem Wert der Größe entspricht. Die Option -s ist nur nützlich, wenn Typen aufgelistet werden. Wenn -s angegeben ist, wird -e immer impliziert.

-t

Nur Typen auflisten.

-v

Ausführliche Ausgabe Dadurch erhalten Sie zusätzliche Informationen, z. B. die Gesamtgröße einer Struktur und die Anzahl ihrer Elemente. Wenn dies zusammen mit der Suchoption -y verwendet wird, werden alle Symbole angezeigt, auch solche ohne zugeordnete Typinformationen.

SearchOpts
Gibt eine oder mehrere der in der folgenden Tabelle angegebenen Optionen an. Diesen Optionen wird ein Bindestrich vorangestellt.

Option Beschreibung

-n

Dies gibt an, dass der next-Parameter ein Name ist. Dies sollte verwendet werden, wenn das nächste Element vollständig aus Hexadezimalzeichen besteht, da es andernfalls als Adresse verwendet wird.

-y

Dies gibt an, dass der nächste Parameter der Anfang des Namens ist, nicht unbedingt der gesamte Name. Wenn -y enthalten ist, werden alle Übereinstimmungen aufgelistet, gefolgt von detaillierten Informationen zur ersten Übereinstimmung in der Liste. Wenn -y nicht enthalten ist, werden nur genaue Übereinstimmungen angezeigt.

Modul
Ein optionaler Parameter, der das Modul angibt, das diese Struktur definiert. Wenn eine lokale Variable oder ein Lokaler Typ mit demselben Namen wie eine globale Variable oder ein globaler Typ vorhanden ist, sollten Sie das Modul einschließen, um anzugeben, dass Sie die globale Variable meinen. Andernfalls zeigt der dt-Befehl die lokale Variable an, auch wenn die lokale Variable eine Übereinstimmung ohne Berücksichtigung der Groß-/Kleinschreibung ist und die globale Variable eine Übereinstimmung mit Berücksichtigung der Groß-/Kleinschreibung ist.

Namen
Gibt den Namen eines Typs oder einer globalen Variablen an. Wenn Name mit einem Sternchen (*) endet, wird eine Liste aller Übereinstimmungen angezeigt. Daher listet dt A\* alle Datentypen, globalen und statischen Elemente auf, beginnend mit "A", zeigt jedoch nicht die tatsächlichen Instanzen dieser Typen an. (Wenn die Anzeigeoption -v gleichzeitig verwendet wird, werden alle Symbole angezeigt – nicht nur solche mit zugeordneten Typinformationen.) Sie können Name auch durch einen Punkt (.) ersetzen, um anzugeben, dass Sie den zuletzt verwendeten Wert von Name wiederholen möchten.

Wenn Name ein Leerzeichen enthält, sollte es in Klammern eingeschlossen werden.

Feld
Gibt die anzuzeigenden Felder an. Wenn Feld ausgelassen wird, werden alle Felder angezeigt. Wenn auf Feld ein Punkt (.) folgt, werden auch die Unterfelder der ersten Ebene dieses Felds angezeigt. Wenn Feld mit einer Reihe von Punkten gefolgt wird, werden die Unterfelder in einer Tiefe angezeigt, die der Anzahl von Punkten entspricht. Jeder Feldname, gefolgt von einem Punkt, wird als Präfix-Übereinstimmung behandelt, als ob die Suchoption -y verwendet würde. Wenn auf Feld ein Sternchen (*) folgt, wird es nur als Anfang des Felds behandelt, nicht unbedingt das gesamte Feld, und alle übereinstimmenden Felder werden angezeigt.

Adresse
Gibt die Adresse der anzuzeigenden Struktur an. Wenn Name ausgelassen wird, muss Address eingeschlossen werden und die Adresse einer globalen Variablen angeben. Die Adresse wird als virtuelle Adresse betrachtet, sofern nicht anders angegeben. Verwenden Sie die Option -p , um eine physische Adresse anzugeben. Verwenden Sie ein "at"-Zeichen ( @ ), um ein Register anzugeben (z. B. @eax).

Liste
Gibt den Feldnamen an, der eine verknüpfte Liste verknüpft. Der Parameter Address muss enthalten sein.

Environment

Element BESCHREIBUNG
Modi Benutzermodus, Kernelmodus
Targets Liveabbild, Absturzabbild
Plattformen Alle

Zusätzliche Informationen

Eine Übersicht über die Speicherbearbeitung und eine Beschreibung anderer speicherbezogener Befehle finden Sie unter Lesen und Schreiben von Arbeitsspeicher.

Hinweise

Die Dt-Befehlsausgabe zeigt immer signierte Zahlen in Basis 10 und zahlen ohne Vorzeichen im Hexadezimalformat an.

Alle Dt-Parameter , die Symbolwerte zulassen, lassen auch Zeichenfolgenplatzhalter zu. Weitere Informationen finden Sie unter Zeichenfolgenplatzhaltersyntax .

Die Optionen -y und -n können jedem Namen oder Feld vorangestellt werden. Mit der Option -y können Sie den Anfang des Typ- oder Strukturnamens angeben. Beispielsweise zeigt dt -y ALLEN Daten über den Typ ALLENTOWN an. Sie konnten den Typ ALLENTOWN jedoch nicht mit dt -y A anzeigen. Stattdessen müssten Sie dt -ny A verwenden, da A ein gültiger Hexadezimalwert ist und ohne die Option -n als Adresse interpretiert wird.

Wenn Name eine Struktur angibt, werden alle Felder angezeigt (z. B. dt myStruct). Wenn Sie nur ein bestimmtes Feld möchten, können Sie dt myStruct myField tun. Dadurch wird das Element angezeigt, das C myStruct.myField aufrufen würde. Beachten Sie jedoch, dass der Befehl dt myStruct myField1 myField2myStruct.myField1 und myStruct.myField2 anzeigt. MyStruct.myField1.myField2 wird nicht angezeigt.

Wenn auf einen Strukturnamen oder ein Feld ein Tiefgestellt folgt, gibt dies eine einzelne instance eines Arrays an. Beispielsweise zeigt dt myStruct myFieldArray[3] das vierte Element des betreffenden Arrays an. Wenn auf einen Typnamen jedoch ein Tiefgestellt folgt, gibt dies ein gesamtes Array an. Beispielsweise zeigt dt CHAR[8] myPtr eine achtstellige Zeichenfolge an. Der Tiefgestellt wird unabhängig vom aktuellen Radix immer als Dezimalzeichen verwendet; Ein 0x-Präfix verursacht einen Fehler.

Da der Befehl Typinformationen aus verwendet. PDB-Datei , kann frei verwendet werden, um jede CPU-Plattform zu debuggen.

Die von dt verwendeten Typinformationen enthalten alle Typnamen, die mit typedef erstellt wurden, einschließlich aller von Windows definierten Typen. Beispielsweise sind unsigned long und char keine gültigen Typnamen, aber ULONG und CHAR . Eine vollständige Liste aller Windows-Typnamen finden Sie im Microsoft Windows SDK.

Alle Typen, die von typedefs in Ihrem eigenen Code erstellt wurden, sind vorhanden, solange sie tatsächlich in Ihrem Programm verwendet wurden. Typen, die in Ihren Headern definiert, aber nie tatsächlich verwendet werden, werden nicht in den PDB-Symboldateien gespeichert und sind für den Debugger nicht zugänglich. Um einen solchen Typ für den Debugger verfügbar zu machen, verwenden Sie ihn als Eingabe einer typedef-Anweisung . Wenn beispielsweise Folgendes in Ihrem Code angezeigt wird, wird die Struktur MY_DATA in der PDB-Symboldatei gespeichert und kann mit dem Befehl dt angezeigt werden:

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

Auf der anderen Seite würde der folgende Code nicht ausreichen, da sowohl MY_DATA als auch PMY_DATA durch die anfängliche typedef definiert sind und daher MY_DATA selbst nicht als Eingabe einer typedef-Anweisung verwendet wurde:

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

In jedem Fall sind Typinformationen nur in einer vollständigen Symboldatei enthalten, nicht in einer Symboldatei, der alle privaten Symbolinformationen entfernt wurden. Weitere Informationen finden Sie unter Öffentliche und private Symbole.

Wenn Sie Unicode-Zeichenfolgen anzeigen möchten, müssen Sie zuerst den Befehl .enable_unicode (Unicode-Anzeige aktivieren) verwenden. Sie können die Anzeige von langen ganzen Zahlen mit dem Befehl .enable_long_status (Long Integer Display aktivieren) steuern.

Im folgenden Beispiel zeigt dt eine globale Variable an:

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

Im folgenden Beispiel zeigt dt das Arrayfeld gn an:

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

Der folgende Befehl zeigt einige Unterfelder einer Variablen an:

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

Der folgende Befehl zeigt die Unterfelder des Felds m_t1 an. Da der Punkt automatisch einen Präfixabgleich verursacht, werden hiermit auch Unterfelder jedes Felds angezeigt, das mit "m_t1" beginnt:

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 

Sie können dies in jeder Tiefe wiederholen. Beispiel: der Befehl dt mcl1 a.. c. zeigt alle Felder bis tiefe vier an, sodass der Name des ersten Felds mit einem und der dritte Feldname mit c beginnt.

Im Folgenden finden Sie ein ausführlicheres Beispiel für die Anzeige von Unterfeldern. Zeigen Sie zunächst das Ldr-Feld an:

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

Erweitern Sie nun das Feld "Zeigertyp":

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) 

Zeigen Sie nun das Feld CriticalSectionTimeout an :

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

Erweitern Sie nun die Unterfelder der CriticalSectionTimeout-Struktur um eine Ebene tief:

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

Erweitern Sie nun die Unterfelder der CriticalSectionTimeout-Struktur um zwei Ebenen:

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 

Der folgende Befehl zeigt eine instance des Datentyps MYTYPE1 an, der sich unter der adresse 0x0100297C befindet:

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

Der folgende Befehl zeigt ein Array von 10 ULONGs an der Adresse 0x01002BE0 an:

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 

Der folgende Befehl setzt die vorherige Anzeige an einer anderen Adresse fort. Beachten Sie, dass "ULONG" nicht erneut eingegeben werden muss:

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

Im Folgenden finden Sie einige Beispiele für den Anzeigetyp. Der folgende Befehl zeigt alle Typen und Globalen ab der Zeichenfolge "MY" im Modul thismodule an. Diejenigen, denen eine Adresse vorangestellt ist, sind tatsächliche Instanzen; diejenigen ohne Adressen sind Typdefinitionen:

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 

Bei der Typanzeige kann die Option -v verwendet werden, um die Größe der einzelnen Elemente anzuzeigen. Die Größenoption-s kann nur zum Aufzählen von Elementen einer bestimmten Größe verwendet werden. Auch hier sind diejenigen, denen eine Adresse vorangestellt ist, tatsächliche Instanzen; diejenigen ohne Adressen sind Typdefinitionen:

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 

Hier ist ein Beispiel für die Option -b . Die -Struktur wird erweitert, und das OwnerThreads-Array innerhalb der -Struktur wird erweitert, aber die Flink - und Blinklistenzeiger werden nicht befolgt:

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

Hier ist ein Beispiel für dt im Kernelmodus. Der folgende Befehl erzeugt ähnliche Ergebnisse wie !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"

.... 

Wenn Sie einen Befehl für jedes Element der Liste ausführen möchten, verwenden Sie die Erweiterung !list .

Schließlich zeigt der Befehl dt -h einen kurzen Hilfetext an, der die dt-Syntax zusammenfasst.