dx (Mostrar expresión del modelo de objetos 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 iterables. 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 que sea iterable tendrá un elemento de menú contextual select (o clic con el botón derecho) agregado a través de DML denominado "Mostrar como cuadrícula". Al seleccionar y mantener (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 en la vista de árbol estándar.

Un (+) mostrado por un nombre de columna ofrece tanto una selección como una suspensión (o un clic con el botón derecho) y un comportamiento de selección.

  • Seleccione toma esa columna y la explota en su propia tabla. Verá las filas originales más los elementos secundarios de la columna expandida.
  • Seleccione y mantenga presionada (o haga clic con el botón derecho) proporciona "Expandir en cuadrícula", que toma la columna y la agrega de nuevo a la tabla actual como la mayoría de las columnas correctas.

-Gc #

Se muestra como una cuadrícula y restringe los tamaños de celda de cuadrícula al número especificado de caracteres (#).

-c # Muestra la continuación del contenedor (omitiendo los 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. Usar la visualización de NatVis (el valor predeterminado) o usar las estructuras nativas subyacentes de C/C++. Especifique el parámetro -n para representar la salida con solo las estructuras nativas de C/C++ y no las visualizaciones de NatVis.

-v

Mostrar información detallada que incluya 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 especificadores de formato siguientes para modificar la representación predeterminada.

Especificador de formato Descripción
X Mostrar ordinales en hexadecimales
D Mostrar ordinales en decimal
,o Mostrar ordinales en octal
B Mostrar ordinales en binario
,en Mostrar enumeraciones por nombre (sin valor)
C Mostrar como un solo carácter (no una cadena)
,s Mostrar cadenas de 8 bits como comillas ASCII
Sb Mostrar cadenas de 8 bits como ASCII sin comillas
,s8 Mostrar cadenas de 8 bits como comillas UTF-8
,s8b Mostrar cadenas de 8 bits como UTF-8 sin comillas
,su Mostrar cadenas de 16 bits como comillas UTF-16
Sub Mostrar cadenas de 16 bits como UTF-16 sin preguntas
,! Mostrar objetos en modo sin formato (por ejemplo, sin NatVis)
,# Especifique la longitud del puntero, matriz o contenedor como valor literal # (reemplace por numérico)
,[<expression>] Especificar la longitud del puntero, matriz o contenedor como expresión de expresión <>
Nd No encuentre el tipo derivado (runtype) del objeto. Mostrar solo valor estático

dx-?

Mostrar ayuda de la línea de comandos.

dx-h Muestra ayuda para 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 línea de comandos

El comando .dx settings se puede usar para mostrar información sobre el objeto Configuración de depuración. Para obtener más información sobre los objetos de configuración de depuración, vea .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: sesiones, configuración y estado.

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

Captura de pantalla de la salida del comando dx -g @$curprocess.modules, que muestra la salida de la cuadrícula en columnas.

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   [Categorizied 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 @$]

Mostrar información de TEB y PEB mediante el objeto Environment

Use 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 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
        ...

Kernel Io.Handles (objeto)

Use el objeto Io.Handles del 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 . 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 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 ocasiones en las que no toda la información de tipo está disponible en los símbolos públicos. En este ejemplo se 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 un 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 el cambio de evaluadores de expresiones con la sintaxis @@ MASM. Para obtener más información sobre los evaluadores de expresiones, vea 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 las 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, vea 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 de depurador con NatVis, vea Objetos de depurador nativo en NatVis.

Para obtener información sobre el uso de objetos de depurador con JavaScript, vea Objetos de depurador nativos en extensiones de JavaScript.

Consulte también

Uso de LINQ Con los objetos del depurador

Objetos de depurador nativos en NatVis

Objetos de depurador nativos en extensiones de JavaScript