dx (Display Debugger Object Model Expression)
Derdx-Befehl zeigt einen C++-Ausdruck mithilfe des NatVis-Erweiterungsmodells an. Weitere Informationen zu NatVis finden Sie unter Benutzerdefinierte Ansichten von nativen Objekten erstellen.
dx [-g|-gc #][-c #][-n|-v]-r[#] Expression[,<FormatSpecifier> ]
dx [{-?}|{-h}]
Parameter
Ausdruck
Ein C++-Ausdruck, der angezeigt werden soll.
-g
Als Datenrasterobjekte anzeigen, die iterierbar sind. Jedes iterierte Element ist eine Zeile im Raster, und jedes untergeordnete Element dieser Elemente ist eine Spalte. Auf diese Weise können Sie etwas wie ein Array von Strukturen anzeigen, wobei jedes Arrayelement in einer Zeile angezeigt wird und jedes Feld der Struktur in einer Spalte angezeigt wird.
Wenn Sie einen Spaltennamen auswählen (wobei eine DML-Verknüpfung verfügbar ist) wird nach dieser Spalte sortiert. Wenn die Sortierreihenfolge bereits nach dieser Spalte sortiert ist, wird die Sortierreihenfolge umgekehrt.
Jedes Objekt, das iterierbar ist, enthält ein Auswahl- und Haltebereichselement (oder Sie klicken mit der rechten Maustaste darauf), das über DML namens "Display as Grid" hinzugefügt wird. Wenn Sie ein Objekt im Ausgabefenster auswählen und gedrückt halten (oder mit der rechten Maustaste darauf klicken), wird das Objekt in der Rasteransicht anstelle der Standardstrukturansicht angezeigt.
Ein (+), das von einem Spaltennamen angezeigt wird, bietet sowohl einen Auswahl-und-Halte-Wert (oder Sie klicken mit der rechten Maustaste) als auch ein Auswahlverhalten.
- Wählen Sie diese Spalte aus und explodiert sie in einer eigenen Tabelle. Die ursprünglichen Zeilen sowie die untergeordneten Elemente der erweiterten Spalte werden angezeigt.
- Auswählen und Halten (oder mit der rechten Maustaste klicken) stellt "In Raster erweitern (Expand Into Grid)" bereit, das die Spalte einnimmt und sie wieder zur aktuellen Tabelle als die meisten Spalten hinzufügt.
-gc #
Als Raster anzeigen und Rasterzellengrößen auf die angegebene Anzahl von (#)-Zeichen beschränken.
-c # Zeigt die Containerfortsetzung an (überspringen von # Elementen des Containers). Diese Option wird in der Regel in benutzerdefinierten Ausgabeautomatisierungsszenarien verwendet und bietet ein "..." Fortsetzungselement unten im Eintrag.
-n Es gibt zwei Möglichkeiten, wie Daten gerendert werden können. Verwenden der NatVis-Visualisierung (Standard) oder Verwenden der zugrunde liegenden systemeigenen C/C++-Strukturen. Geben Sie den Parameter -n an, um die Ausgabe mit nur den systemeigenen C/C++-Strukturen und nicht den NatVis-Visualisierungen zu rendern.
-v
Zeigen Sie ausführliche Informationen an, die Methoden und andere nicht typische Objekte enthalten.
-r#
Rekursives Anzeigen von Untertypen (Feldern) bis zu # Ebenen. Wenn # nicht angegeben ist, ist eine Rekursionsebene von 1 der Standardwert.
[<,FormatSpecifier>]
Verwenden Sie einen der folgenden Formatbezeichner, um das Standardrendering zu ändern.
Formatbezeichner | Beschreibung |
---|---|
,x | Anzeigen von Ordnungszahlen in hexadezimaler Zahl |
,d | Anzeigen von Ordnungszahlen im Dezimalzeichen |
,o | Anzeigen von Ordnungszahlen im Oktal |
,b | Anzeigen von Ordnungszahlen in binärer Version |
,en | Anzeigen von Enumerationen nur nach Namen (kein Wert) |
,c | Als einzelnes Zeichen anzeigen (keine Zeichenfolge) |
,s | Anzeigen von 8-Bit-Zeichenfolgen als ASCII-Anzeichen |
,sb | 8-Bit-Zeichenfolgen als ASCII ohne Anführungszeichen anzeigen |
,s8 | Anzeigen von 8-Bit-Zeichenfolgen als UTF-8-Zitat |
,s8b | 8-Bit-Zeichenfolgen als UTF-8 ohne Anführungszeichen anzeigen |
,su | Anzeigen von 16-Bit-Zeichenfolgen als UTF-16-Zitat |
,sub | 16-Bit-Zeichenfolgen als UTF-16 ohne Anführungszeichen anzeigen |
,! | Nur Objekte im unformatierten Modus anzeigen (z. B. kein NatVis) |
, # | Angeben der Länge des Zeigers/Arrays/Containers als Literalwert # (ersetzen durch numerische Werte) |
,[<Ausdruck>] | Geben Sie die Länge des Zeigers/Arrays/Containers als Ausdruck <-Ausruck> an |
,nd | Suchen Sie den abgeleiteten (Runtyp) des Objekts nicht. Nur statischer Wert anzeigen |
dx -?
Befehlszeilenhilfe anzeigen.
dx -h Zeigt hilfe für Objekte an, die im Debugger verfügbar sind.
dx -id
Nur für die interne Verwendung durch Microsoft vorgesehen. Wird verwendet, um Datenmodelllinks in der Befehlsausgabe zu folgen.
Beispiel für die Verwendung der Befehlszeile
Der Befehl ".dx settings" kann verwendet werden, um Informationen zum Debugeinstellungsobjekt anzuzeigen. Weitere Informationen zu den Debugeinstellungsobjekten finden Sie unter .settings.
kd> dx -r1 Debugger.Settings
Debugger.Settings
Debug
Display
EngineInitialization
Extensions
Input
Sources
Symbols
AutoSaveSettings : false
Verwenden Sie die Option -r1-Rekursion, um die anderen Debuggerobjekte – Sitzungen, Einstellungen und Zustand – anzuzeigen.
kd> dx -r1 Debugger
Debugger
Sessions
Settings
State
Utility
LastEvent
Geben Sie das Debugger.Sessions-Objekt mit der Option -r3-Rekursion an, um weiter nach unten in der Objektkette zu reisen.
kd> dx -r3 Debugger.Sessions
Debugger.Sessions
[0] : Remote KD: KdSrv:Server=@{<Local>},Trans=@{1394:Channel=0}
Processes
[0] : <Unknown Image>
[4] : <Unknown Image>
[304] : smss.exe
[388] : csrss.exe
[456] : wininit.exe
[468] : csrss.exe
[528] : services.exe
[536] : lsass.exe
[544] : winlogon.exe
[620] : svchost.exe
... ...
Fügen Sie den X-Formatbezeichner hinzu, um die Ordinalwerte im Hexadezimalwert anzuzeigen.
kd> dx -r3 Debugger.Sessions,x
Debugger.Sessions,x
[0x0] : Remote KD: KdSrv:Server=@{<Local>},Trans=@{1394:Channel=0}
Processes
[0x0] : <Unknown Image>
[0x4] : <Unknown Image>
[0x130] : smss.exe
[0x184] : csrss.exe
[0x1c8] : wininit.exe
[0x1d4] : csrss.exe
[0x210] : services.exe
[0x218] : lsass.exe
[0x220] : winlogon.exe
[0x26c] : svchost.exe
[0x298] : svchost.exe
[0x308] : dwm.exe
[0x34c] : nvvsvc.exe
[0x37c] : nvvsvc.exe
[0x384] : svchost.exe
... ...
In diesem Beispiel wird eine aktive Debugsitzung verwendet, um den Aufrufstapel des ersten Threads im ersten Prozess auflisten zu können.
kd> dx -r1 Debugger.Sessions.First().Processes.First().Threads.First().Stack.Frames
Debugger.Sessions.First().Processes.First().Threads.First().Stack.Frames
[0x0] : nt!RtlpBreakWithStatusInstruction
[0x1] : nt!KdCheckForDebugBreak + 0x7a006
[0x2] : nt!KiUpdateRunTime + 0x42
[0x3] : nt!KiUpdateTime + 0x129
[0x4] : nt!KeClockInterruptNotify + 0x1c3
[0x5] : hal!HalpTimerClockInterruptEpilogCommon + 0xa
[0x6] : hal!HalpTimerClockInterruptCommon + 0x3e
[0x7] : hal!HalpTimerClockInterrupt + 0x1cb
[0x8] : nt!KiIdleLoop + 0x1a
Verwenden Sie die Option "-g", um die Ausgabe als Datenraster anzuzeigen. Wählen Sie die zu sortierende Spalte aus.
kd> dx -g @$curprocess.Modules
Verwenden Sie die Option -h, um Informationen zu Objekten anzuzeigen.
kd> dx -h Debugger.State
Debugger.State [State pertaining to the current execution of the debugger (e.g.: user variables)]
DebuggerVariables [Debugger variables which are owned by the debugger and can be referenced by a pseudo-register prefix of @$]
PseudoRegisters [Categorized debugger managed pseudo-registers which can be referenced by a pseudo-register prefix of @$]
UserVariables [User variables which are maintained by the debugger and can be referenced by a pseudo-register prefix of @$]
Anzeigen von TEB- und PEB-Informationen mithilfe des Environment-Objekts
Verwenden Sie das Environment-Objekt, um TEB- und PEB-Informationen anzuzeigen, die dem Thread und Prozess zugeordnet sind.
Verwenden Sie diesen Befehl, um den dem aktuellen Thread zugeordneten TEB anzuzeigen.
0: kd> dx -r2 @$curthread.Environment
@$curthread.Environment
EnvironmentBlock [Type: _TEB]
[+0x000] NtTib [Type: _NT_TIB]
[+0x038] EnvironmentPointer : Unable to read memory at Address 0x38
[+0x040] ClientId [Type: _CLIENT_ID]
[+0x050] ActiveRpcHandle : Unable to read memory at Address 0x50
[+0x058] ThreadLocalStoragePointer : Unable to read memory at Address 0x58
[+0x060] ProcessEnvironmentBlock : Unable to read memory at Address 0x60
[+0x068] LastErrorValue : Unable to read memory at Address 0x68
[+0x06c] CountOfOwnedCriticalSections : Unable to read memory at Address 0x6c
[+0x070] CsrClientThread : Unable to read memory at Address 0x70
[+0x078] Win32ThreadInfo : Unable to read memory at Address 0x78
[+0x080] User32Reserved [Type: unsigned long [26]]
[+0x0e8] UserReserved [Type: unsigned long [5]]
[+0x100] WOW32Reserved : Unable to read memory at Address 0x100
[+0x108] CurrentLocale : Unable to read memory at Address 0x108
[+0x10c] FpSoftwareStatusRegister : Unable to read memory at Address 0x10c
...
Verwenden Sie diesen Befehl, um PEB anzuzeigen, der dem aktuellen Prozess zugeordnet ist.
0: kd> dx -r2 @$curprocess.Environment
@$curprocess.Environment
EnvironmentBlock [Type: _PEB]
[+0x000] InheritedAddressSpace : Unable to read memory at Address 0x0
[+0x001] ReadImageFileExecOptions : Unable to read memory at Address 0x1
[+0x002] BeingDebugged : Unable to read memory at Address 0x2
[+0x003] BitField : Unable to read memory at Address 0x3
[+0x003 ( 0: 0)] ImageUsesLargePages : Unable to read memory at Address 0x3
[+0x003 ( 1: 1)] IsProtectedProcess : Unable to read memory at Address 0x3
[+0x003 ( 2: 2)] IsImageDynamicallyRelocated : Unable to read memory at Address 0x3
[+0x003 ( 3: 3)] SkipPatchingUser32Forwarders : Unable to read memory at Address 0x3
[+0x003 ( 4: 4)] IsPackagedProcess : Unable to read memory at Address 0x3
[+0x003 ( 5: 5)] IsAppContainer : Unable to read memory at Address 0x3
[+0x003 ( 6: 6)] IsProtectedProcessLight : Unable to read memory at Address 0x3
[+0x003 ( 7: 7)] IsLongPathAwareProcess : Unable to read memory at Address 0x3
[+0x004] Padding0 [Type: unsigned char [4]]
[+0x008] Mutant : Unable to read memory at Address 0x8
[+0x010] ImageBaseAddress : Unable to read memory at Address 0x10
[+0x018] Ldr : Unable to read memory at Address 0x18
[+0x020] ProcessParameters : Unable to read memory at Address 0x20
...
Kernel Io.Handles-Objekt
Verwenden Sie das aktuelle Prozessobjekt "Io.Handles", um Kernelhandleinformationen anzuzeigen.
0: kd> dx -r1 @$curprocess.Io.Handles
@$curprocess.Io.Handles
[0x8]
[0xc]
[0x10]
[0x14]
[0x18]
...
Verwenden Sie die Funktion .First(), um Informationen zum ersten Handle anzuzeigen.
0: kd> dx -r2 @$curprocess.Io.Handles.First()
@$curprocess.Io.Handles.First()
Handle : 0x8
Type : Unexpected failure to dereference object
GrantedAccess : Unexpected failure to dereference object
Object [Type: _OBJECT_HEADER]
[+0x000] PointerCount : 228806 [Type: __int64]
[+0x008] HandleCount : 6 [Type: __int64]
[+0x008] NextToFree : 0x6 [Type: void *]
[+0x010] Lock [Type: _EX_PUSH_LOCK]
[+0x018] TypeIndex : 0xf2 [Type: unsigned char]
[+0x019] TraceFlags : 0x0 [Type: unsigned char]
[+0x019 ( 0: 0)] DbgRefTrace : 0x0 [Type: unsigned char]
[+0x019 ( 1: 1)] DbgTracePermanent : 0x0 [Type: unsigned char]
[+0x01a] InfoMask : 0x0 [Type: unsigned char]
[+0x01b] Flags : 0x2 [Type: unsigned char]
[+0x01b ( 0: 0)] NewObject : 0x0 [Type: unsigned char]
[+0x01b ( 1: 1)] KernelObject : 0x1 [Type: unsigned char]
[+0x01b ( 2: 2)] KernelOnlyAccess : 0x0 [Type: unsigned char]
[+0x01b ( 3: 3)] ExclusiveObject : 0x0 [Type: unsigned char]
[+0x01b ( 4: 4)] PermanentObject : 0x0 [Type: unsigned char]
[+0x01b ( 5: 5)] DefaultSecurityQuota : 0x0 [Type: unsigned char]
[+0x01b ( 6: 6)] SingleHandleEntry : 0x0 [Type: unsigned char]
[+0x01b ( 7: 7)] DeletedInline : 0x0 [Type: unsigned char]
[+0x01c] Reserved : 0x0 [Type: unsigned long]
[+0x020] ObjectCreateInfo : 0xfffff801f6d9c6c0 [Type: _OBJECT_CREATE_INFORMATION *]
[+0x020] QuotaBlockCharged : 0xfffff801f6d9c6c0 [Type: void *]
[+0x028] SecurityDescriptor : 0xffffb984aa815d06 [Type: void *]
[+0x030] Body [Type: _QUAD]
ObjectType : Unexpected failure to dereference object
UnderlyingObject : Unexpected failure to dereference object
Beachten Sie, dass das Io.Handles-Objekt ein einziges Kernelobjekt ist.
Umgehen von Symboldateibeschränkungen bei Umwandlung
Beim Anzeigen von Informationen zu verschiedenen Windows-Systemvariablen gibt es Zeiten, in denen nicht alle Typinformationen in den öffentlichen Symbolen verfügbar sind. Das folgende Beispiel veranschaulicht diese Situation.
0: kd> dx nt!PsIdleProcess
Error: No type (or void) for object at Address 0xfffff800e1d50128
Der dx-Befehl unterstützt die Möglichkeit, auf die Adresse einer Variablen zu verweisen, die keine Typinformationen enthält. Solche „Adresse von“-Referenzen werden als „void *“ behandelt und können als solche umgewandelt werden. Dies bedeutet, dass die folgende Syntax verwendet werden kann, wenn der Datentyp bekannt ist, um Typinformationen für die Variable anzuzeigen.
dx (Datatype *)&VariableName
Zum Beispiel für ein nt!PsIdleProcess mit dem Datentyp nt!_EPROCESS verwenden Sie diesen Befehl.
dx (nt!_EPROCESS *)&nt!PsIdleProcess
(nt!_EPROCESS *)&nt!PsIdleProcess : 0xfffff800e1d50128 [Type: _EPROCESS *]
[+0x000] Pcb [Type: _KPROCESS]
[+0x2c8] ProcessLock [Type: _EX_PUSH_LOCK]
[+0x2d0] CreateTime : {4160749568} [Type: _LARGE_INTEGER]
[+0x2d8] RundownProtect [Type: _EX_RUNDOWN_REF]
[+0x2e0] UniqueProcessId : 0x1000 [Type: void *]
[+0x2e8] ActiveProcessLinks [Type: _LIST_ENTRY]
[+0x2f8] Flags2 : 0x218230 [Type: unsigned long]
[+0x2f8 ( 0: 0)] JobNotReallyActive : 0x0 [Type: unsigned long]
Der dx-Befehl unterstützt das Wechseln von Ausdrucksauswertern mit der @@ MASM-Syntax nicht. Weitere Informationen zu Ausdrucksauswertungen finden Sie unter Auswerten von Ausdrücken.
Verwendung von LINQ mit den Debugger-Objekten
LINQ-Syntax kann mit den Debuggerobjekten verwendet werden, um Daten zu durchsuchen und zu bearbeiten. LINQ ist konzeptuell mit dem strukturierte Abfragesprache (SQL) vergleichbar, das zum Abfragen von Datenbanken verwendet wird. Sie können eine Reihe von LINQ-Methoden verwenden, um Debugdaten zu durchsuchen, zu filtern und zu analysieren. Informationen zur Verwendung von LINQ mit den Debuggerobjekten finden Sie unter Verwenden von LINQ mit den Debuggerobjekten.
Verwenden von Debuggerobjekten mit NatVis und JavaScript
Informationen zur Verwendung von Debuggerobjekten mit NatVis finden Sie unter Native Debuggerobjekte in NatVis.
Informationen zur Verwendung von Debuggerobjekten mit JavaScript finden Sie unter Native Debuggerobjekte in JavaScript-Erweiterungen.
Weitere Informationen
Verwendung von LINQ mit den Debugger-Objekten
Native Debugger-Objekte in NatVis
Native Debugger-Objekte in JavaScript-Erweiterungen