dt (Anzeigetyp)
Der Befehl dt zeigt Informationen zu einer lokalen Variablen, globalen Variablen oder Datentyp an. Dadurch können Informationen zu einfachen Datentypen sowie Strukturen und Gewerkschaften angezeigt werden.
Benutzermodussyntax
dt [-DisplayOpts] [-SearchOpts] [module!]Name [[-SearchOpts] Field] [Address] [-l List]
dt [-DisplayOpts] Address [-l List]
dt -h
Kernelmodussyntax
[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[Menge] |
Zeigen Sie jedes Arrayelement in einer neuen Zeile mit dem Index an. Es werden insgesamt Mengenelemente angezeigt. Es darf kein Leerzeichen zwischen der A - und der Menge vorhanden sein. Wenn -a nicht auf eine Ziffer folgt, werden alle Elemente im Array angezeigt. Der Schalter -a[Menge] sollte unmittelbar vor jedem Typnamen oder Feldnamen angezeigt werden, der auf diese Weise angezeigt werden soll. |
-b |
Rekursive Blöcke anzeigen. 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 akzeptiert jedes Arrayelement eine Zeile, anstatt als mehrere Zeilenblock formatiert zu werden.) |
-d |
Wenn sie mit einem Namen verwendet wird, der mit einem Sternchen endet, zeigen Sie ausführliche Ausgabe für alle Typen an, die mit Name beginnen. Wenn Name nicht mit einem Sternchen endet, zeigen Sie ausführliche Ausgabe an. |
-e |
Erzwingt dt zum Aufzählen von Typen. Diese Option ist nur erforderlich, wenn dt versehentlich den Name-Wert als Instanz und nicht als Typ interpretiert. |
-i |
Die Untertypen nicht einziehen. |
-o |
Lassen Sie Offsetwerte der Strukturfelder weg. |
-p |
Die Adresse ist eine physische Adresse anstelle einer virtuellen Adresse. |
-r[tiefe] |
Rekursiv abbildet die Untertypfelder. Wenn die Tiefe angegeben wird, wird diese Rekursion nach Tiefenebenen beendet. Die Tiefe muss eine Ziffer zwischen 1 und 9 sein, und es darf kein Leerraum zwischen r und der Tiefe vorhanden sein. Der Schalter -r[Tiefe] sollte unmittelbar vor der Adresse angezeigt werden. |
-s Größe |
Aufzählen Sie nur die Typen, deren Größe in Byte dem Wert der Größe entspricht. Die Option -s ist nur nützlich, wenn Typen aufgezählt werden. Wenn -s angegeben ist, wird -e immer impliziert. |
-t |
Nur Typen aufzählen. |
-v |
Ausführliche Ausgabe. Dadurch werden zusätzliche Informationen wie die Gesamtgröße einer Struktur und die Anzahl der zugehörigen Elemente bereitgestellt. Wenn dies zusammen mit der Option "-y "-Suche verwendet wird, werden alle Symbole angezeigt, auch wenn keine zugehörigen Typinformationen vorhanden sind. |
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 nächste Parameter ein Name ist. Dies sollte verwendet werden, wenn das nächste Element vollständig aus hexadezimalen Zeichen 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 Modul einschließen, um anzugeben, dass Sie die globale Variable bedeuten. Andernfalls zeigt der Befehl dt die lokale Variable an, auch wenn die lokale Variable eine Übereinstimmung zwischen Groß- und Kleinschreibung ist und die globale Variable eine Übereinstimmung zwischen Groß- und Kleinschreibung ist.
Name
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 Statiken auf, die mit "A" beginnen, zeigen jedoch nicht die tatsächlichen Instanzen dieser Typen an. (Wenn die Option "-v"-Anzeige gleichzeitig verwendet wird, werden alle Symbole angezeigt – nicht nur die Symbole mit den zugehörigen Typinformationen.) Sie können den Namen 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 er in Klammern eingeschlossen werden.
Feld
Gibt die anzuzeigenden Felder an. Wenn Feld nicht angegeben wird, werden alle Felder angezeigt. Wenn auf ein 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 auf eine Tiefe angezeigt, die der Anzahl der Perioden entspricht. Jeder Feldname gefolgt von einem Punkt wird als Präfix-Übereinstimmung behandelt, als ob die Suchoption -y verwendet wurde. Wenn dem 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 nicht angegeben wird, muss die Adresse enthalten sein und die Adresse einer globalen Variablen angeben. Die Adresse wird als virtuelle Adresse angenommen, 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 Address-Parameter muss eingeschlossen werden.
Environment
Element | Beschreibung |
---|---|
Modi | Benutzermodus, Kernel-Modus |
Ziele | Live, Crash Dump |
Plattformen | Alle |
Zusätzliche Informationen
Einen Überblick über die Speichermanipulation und eine Beschreibung anderer speicherbezogener Befehle finden Sie unter Lesen und Schreiben von Speicher.
Hinweise
Die Dt-Befehlsausgabe zeigt immer signierte Zahlen in Basis 10 und nicht signierte Zahlen in hexadezimal an.
Alle Parameter von dt , die Symbolwerte zulassen, lassen auch Zeichenfolgen-Wildcards zu. Ausführliche Informationen finden Sie unter Zeichenfolgen-Wildcardsyntax .
Die Optionen "-y " und "-n " können einem beliebigen Namen oder Feld vorangehen. Mit der Option -y können Sie den Anfang des Typs oder des Strukturnamens angeben. Beispielsweise zeigt dt -y ALLEN Daten zum Typ ALLENTOWN an. Sie konnten jedoch nicht den Typ ALLENTOWN mit dt -y A anzeigen. Stattdessen müssen Sie dt -ny A verwenden, da A ein gültiger Hexadezimalwert ist und als Adresse ohne option -n interpretiert wird.
Wenn Name eine Struktur angibt, werden alle Felder angezeigt (z . B. dt myStruct). Wenn Sie nur ein bestimmtes Feld verwenden möchten, können Sie "myStruct myField" ausführen. Dadurch wird das Element angezeigt, das C myStruct.myField aufrufen würde. Beachten Sie jedoch, dass der Befehl "dt myStruct myField1 myField2" "myStruct.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 Instanz 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 Dezimalstellen verwendet. Ein 0x-Präfix verursacht einen Fehler.
Da der Befehl Typinformationen aus dem .PDB-Datei kann frei zum Debuggen einer beliebigen CPU-Plattform verwendet werden.
Die von dt verwendeten Typinformationen umfassen alle Typnamen, die mit typedef erstellt wurden, einschließlich aller windows-definierten Typen. Beispielsweise sind nicht signierte Lange und Zeichen keine gültigen Typnamen, aber ULONG und CHAR sind. 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 sind, aber nie verwendet werden, werden nicht in den PDB-Symboldateien gespeichert und können nicht auf den Debugger zugreifen. 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 vom Befehl dt angezeigt werden:
typedef struct _MY_DATA {
. . .
} MY_DATA;
typedef MY_DATA *PMY_DATA;
Andererseits reicht der folgende Code nicht aus, da sowohl MY_DATA als auch PMY_DATA durch den ursprünglichen Typedef definiert werden und daher MY_DATA nicht selbst 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, die von allen privaten Symbolinformationen entfernt wurde. Weitere Informationen finden Sie im Artikel zu öffentlichen und privaten Symbolen.
Wenn Sie Unicode-Zeichenfolgen anzeigen möchten, müssen Sie zuerst den Befehl .enable_unicode (Unicode-Anzeige aktivieren) verwenden. Sie können die Anzeige langer ganzzahliger Zahlen mit dem Befehl .enable_long_status (Long Integer Display) 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 den Präfixabgleich verursacht, werden dadurch auch Unterfelder aller Felder angezeigt, die mit "m_t1" beginnen:
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 auf jede Tiefe wiederholen. Beispiel: der Befehl dt mcl1 a.. c. würde alle Felder in Tiefe 4 anzeigen, sodass der erste Feldname mit einem und dem dritten Feldnamen begann mit c.
Nachfolgend finden Sie ein detaillierteres Beispiel dafür, wie Unterfelder angezeigt werden können. Zeigen Sie zuerst das Ldr-Feld an:
0:000> dt nt!_PEB Ldr 7ffdf000
+0x00c Ldr : 0x00191ea0
Erweitern Sie nun das Zeigertypfeld:
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)
Zeigt 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 zwei Ebenen tief:
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 Instanz des Datentyps MYTYPE1 an, die sich an 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
Hier sind einige Beispiele für die Typanzeige. Der folgende Befehl zeigt alle Typen und Globalen an, die mit der Zeichenfolge "MY" im Modul dieses Moduls beginnen. Diejenigen, denen eine Adresse vorangestellt ist, sind tatsächliche Instanzen; solche 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
Beim Ausführen der Typanzeige kann die Option -v verwendet werden, um die Größe der einzelnen Elemente anzuzeigen. Die Option "-s size " kann nur zum Aufzählen von Elementen einer bestimmten Größe verwendet werden. Auch hier handelt es sich bei denen, die einer Adresse vorangestellt sind, um tatsächliche Instanzen; solche 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 Blink-Listenzeiger 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 Ergebnisse ähnlich 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 für jedes Element der Liste einen Befehl 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.