dx (Mostrar la expresión del modelo de objeto del depurador)
El comando dx muestra una expresión de C++ mediante el modelo de extensión NatVis. Para obtener más información sobre NatVis, consulte Creación de vistas personalizadas de objetos nativos.
dx [-g|-gc #][-c #][-n|-v]-r[#] Expression[,<FormatSpecifier> ]
dx [{-?}|{-h}]
Parámetros
Expression
Expresión de C++ que se va a mostrar.
-g
Se muestran como objetos de cuadrícula de datos que se pueden iterar. Cada elemento iterado es una fila de la cuadrícula y cada elemento secundario para mostrar de esos elementos es una columna. Esto le permite ver algo como una matriz de estructuras, donde cada elemento de matriz se muestra en una fila y cada campo de la estructura se muestra en una columna.
Al seleccionar un nombre de columna (donde hay un vínculo DML disponible), se ordenará por esa columna. Si ya está ordenado por esa columna, se invertirá el criterio de ordenación.
Cualquier objeto iterable tendrá un elemento de menú contextual de seleccionar y mantener pulsado (o hacer clic con el botón derecho) agregado a través de DML denominado "Mostrar como cuadrícula". Al seleccionar y mantener pulsado (o hacer clic con el botón derecho) un objeto en la ventana de salida y seleccionarlo, se mostrará el objeto en la vista de cuadrícula en lugar de mostrarse en la vista de árbol estándar.
El signo (+) que aparece junto al nombre de una columna permite seleccionar y mantener pulsado (o hacer clic con el botón derecho) y seleccionar.
- Al seleccionar se toma esa columna y la expande en su propia tabla. Verá las filas originales más los elementos secundarios de la columna expandida.
- Al seleccionar y mantener pulsado (o hacer clic con el botón derecho) permite "Expandir en cuadrícula", que toma la columna y la agrega a la tabla actual como las columnas más a la derecha.
-gc #
Se muestra como una cuadrícula y restringe los tamaños de celda de cuadrícula al número especificado de caracteres (n.º).
-c # Muestra la continuación del contenedor (omitiendo n.º elementos del contenedor). Esta opción se usa normalmente en escenarios de automatización de salida personalizados y proporciona un elemento de continuación "..." en la parte inferior de la lista.
-n Hay dos maneras de representar los datos. Mediante la visualización de NatVis (valor predeterminado) o mediante las estructuras nativas subyacentes de C/C++. Especifique el parámetro -n para representar la salida solo con las estructuras nativas de C/C++ y no con las visualizaciones de NatVis.
-v
Muestra información detallada que incluye métodos y otros objetos no típicos.
-r#
Muestra de forma recursiva subtipos (campos) hasta # niveles. Si # no se especifica, un nivel de recursividad de uno es el valor predeterminado.
[<,FormatSpecifier>]
Use cualquiera de los siguientes especificadores de formato para modificar la representación predeterminada.
Especificador de formato | Descripción |
---|---|
,x | Muestra los ordinales como valores hexadecimales |
,d | Muestra los ordinales como valores decimales |
,o | Muestra los ordinales como valores octales |
,b | Muestra los ordinales como valores binarios |
,en | Muestra las enumeraciones solo por nombre (sin valor) |
c, | Muestra como carácter único (no una cadena) |
,s | Muestra cadenas de 8 bits como ASCII entre comillas |
,sb | Muestra cadenas de 8 bits como ASCII sin comillas |
,s8 | Muestra cadenas de 8 bits como UTF-8 entre comillas |
,s8b | Muestra cadenas de 8 bits como UTF-8 sin comillas |
,su | Muestra cadenas de 16 bits como UTF-16 entre comillas |
,sub | Muestra cadenas de 16 bits como UTF-16 sin comillas |
,! | Muestra objetos solo en modo sin formato (por ejemplo, sin NatVis) |
, # | Especifica la longitud del puntero, matriz o contenedor como el n. º del valor literal (reemplazar por valor numérico) |
,[<expresión>] | Especifica la longitud del puntero, la matriz o el contenedor como <expresión> de la expresión |
,nd | No busca el tipo derivado (runtype) del objeto. Muestra solo el valor estático |
dx -?
Muestra la ayuda de la línea de comandos.
dx -h Muestra la ayuda de los objetos disponibles en el depurador.
dx -id
Solo para uso interno de Microsoft. Se usa para seguir los vínculos del modelo de datos en la salida del comando.
Ejemplo de uso de la línea de comandos
El comando de configuración .dx se puede usar para mostrar información sobre el objeto de configuración de depuración. Para obtener más información sobre los objetos de configuración de depuración, consulte .settings.
kd> dx -r1 Debugger.Settings
Debugger.Settings
Debug
Display
EngineInitialization
Extensions
Input
Sources
Symbols
AutoSaveSettings : false
Use la opción de recursividad -r1 para ver los demás objetos del depurador: Sessions, Settings y State.
kd> dx -r1 Debugger
Debugger
Sessions
Settings
State
Utility
LastEvent
Especifique el objeto Debugger.Sessions con la opción de recursividad -r3 para desplazarse más hacia abajo de la cadena de objetos.
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
... ...
Agregue el especificador de formato x para mostrar los valores ordinales en hexadecimal.
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
... ...
En este ejemplo se usa una sesión de depuración activa para enumerar la pila de llamadas del primer subproceso del primer proceso.
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
Use la opción -g para mostrar la salida como una cuadrícula de datos. Seleccione la columna que se va a ordenar.
kd> dx -g @$curprocess.Modules
Use la opción -h para mostrar información sobre los objetos.
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 @$]
Visualización de la información de TEB y PEB mediante el objeto Environment
Utilice el objeto Environment para mostrar información de TEB y PEB asociada al subproceso y al proceso.
Para mostrar el TEB asociado al subproceso actual, use este comando.
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
...
Para mostrar el PEB asociado al proceso actual, use este comando.
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
...
Objeto Io.Handles de kernel
Use el objeto Io.Handles de proceso actual para mostrar la información del identificador del kernel.
0: kd> dx -r1 @$curprocess.Io.Handles
@$curprocess.Io.Handles
[0x8]
[0xc]
[0x10]
[0x14]
[0x18]
...
Use la función First() para mostrar información sobre el primer identificador.
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
Tenga en cuenta que el objeto Io.Handles es un objeto de solo kernel.
Solución de limitaciones del archivo de símbolos con la conversión
Al mostrar información sobre varias variables del sistema de Windows, hay momentos en los que no toda la información de tipo está disponible en los símbolos públicos. Este ejemplo muestra esta situación.
0: kd> dx nt!PsIdleProcess
Error: No type (or void) for object at Address 0xfffff800e1d50128
El comando dx admite la capacidad de hacer referencia a la dirección de una variable que no tiene información de tipo. Estas referencias de "dirección de" se tratan como "void *" y se pueden convertir como tales. Esto significa que si se conoce el tipo de datos, se puede usar la sintaxis siguiente para mostrar información de tipo para la variable.
dx (Datatype *)&VariableName
Por ejemplo, para nt! PsIdleProcess que tiene un tipo de datos nt!_EPROCESS, use este comando.
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]
El comando dx no admite cambiar evaluadores de expresiones con la sintaxis @@ MASM. Para obtener más información sobre los evaluadores de expresiones, consulte Evaluación de expresiones.
Uso de LINQ con los objetos del depurador
La sintaxis LINQ se puede usar con los objetos del depurador para buscar y manipular datos. LINQ es conceptualmente similar al Lenguaje de consulta estructurado (SQL) que se usa para consultar bases de datos. Puede usar varios métodos LINQ para buscar, filtrar y analizar datos de depuración. Para obtener información sobre el uso de LINQ con los objetos del depurador, consulte Uso de LINQ con los objetos del depurador.
Uso de objetos del depurador con NatVis y JavaScript
Para obtener información sobre el uso de objetos del depurador con NatVis, consulte Objetos de depurador nativos en NatVis.
Para obtener información sobre el uso de objetos del depurador con JavaScript, consulte Objetos del depurador nativo en extensiones de JavaScript.
Consulte también
Uso de LINQ con los objetos del depurador
Objetos del depurador nativo en NatVis
Objetos de depurador nativo en extensiones de JavaScript