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

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   [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