dx (Display Debugger Object Model Expression)

La commande dx affiche une expression C++ à l’aide du modèle d’extension NatVis. Pour plus d’informations sur NatVis, consultez Créer des vues personnalisées d’objets natifs.

dx [-g|-gc #][-c #][-n|-v]-r[#] Expression[,<FormatSpecifier> ]
dx [{-?}|{-h}]

Paramètres

Expression

Expression C++ à afficher.

-g

Afficher sous forme d’objets de grille de données itérables. Chaque élément itéré est une ligne dans la grille et chaque enfant d’affichage de ces éléments est une colonne. Cela vous permet d’afficher quelque chose comme un tableau de structs, où chaque élément de tableau est affiché dans une ligne et chaque champ du struct est affiché dans une colonne.

La sélection d’un nom de colonne (où il existe un lien DML disponible) trie selon cette colonne. Si elle est déjà triée par cette colonne, l’ordre de tri est inversé.

Tout objet itérable a un élément de menu contextuel sélectionné et prolongé (ou un clic droit) ajouté via DML appelé « Display as Grid ». Si vous sélectionnez et maintenez enfoncé (ou cliquez avec le bouton droit) un objet dans la fenêtre de sortie et sélectionnez ceci, l’objet s’affiche en mode grille au lieu de l’arborescence standard.

Un (+) affiché par un nom de colonne offre à la fois un comportement select-and-hold (ou clic droit) et un comportement de sélection.

  • Sélectionnez prend cette colonne et l’explose dans sa propre table. Vous voyez les lignes d’origine plus les enfants de la colonne développée.
  • Sélectionner et maintenir (ou cliquer avec le bouton droit) fournit « Développer dans la grille » qui prend la colonne et la rajoute à la table actuelle comme la plupart des colonnes à droite.

-Gc #

Affichez sous forme de grille et limitez les tailles de cellule de grille au nombre spécifié de caractères (#).

-c # Affiche la continuation du conteneur (ignorer les éléments # du conteneur). Cette option est généralement utilisée dans les scénarios d’automatisation de sortie personnalisée et fournit un « ... » élément continuation en bas de la liste.

-¡n Il existe deux façons de rendre les données. Utilisation de la visualisation NatVis (valeur par défaut) ou des structures C/C++ natives sous-jacentes. Spécifiez le paramètre -n pour restituer la sortie en utilisant uniquement les structures C/C++ natives et non les visualisations NatVis.

-v

Affichez des informations détaillées qui incluent des méthodes et d’autres objets non typiques.

-R#

Affichez de manière récursive les sous-types (champs) jusqu’à # des niveaux. Si # n’est pas spécifié, un niveau de récursivité d’un est la valeur par défaut.

[<,FormatSpecifier>]

Utilisez l’un des spécificateurs de format suivants pour modifier le rendu par défaut.

Spécificateur de format Description
X Afficher les ordinaux en hexidecimal
D Afficher les ordinaux en décimal
O Afficher les ordinaux en octal
B Afficher les ordinaux en binaire
,en Afficher les énumérations par nom uniquement (aucune valeur)
C Afficher en tant que caractère unique (pas une chaîne)
,s Afficher des chaînes 8 bits en tant que guillemets ASCII
Sb Afficher des chaînes 8 bits en tant qu’ASCII non guillemets
,s8 Afficher les chaînes 8 bits en tant que guillemets UTF-8
,s8b Afficher des chaînes 8 bits en tant qu’UTF-8 sans guillemets
,su Afficher les chaînes 16 bits en tant que guillemets UTF-16
,sub Afficher des chaînes 16 bits en tant qu’UTF-16 sansqouted
,! Afficher des objets en mode brut uniquement (par exemple, pas de NatVis)
,# Spécifier la longueur du pointeur/tableau/conteneur comme valeur littérale # (remplacez par numérique)
,[<expression>] Spécifier la longueur du pointeur/tableau/conteneur comme expression d’expression <>
Nd Ne trouvez pas le type dérivé (runtype) de l’objet. Afficher la valeur statique uniquement

dx- ?

Afficher l’aide sur la ligne de commande.

dx-h Affiche l’aide pour les objets disponibles dans le débogueur.

dx-id

Réservé à un usage interne Microsoft. Utilisé pour suivre les liens de modèle de données dans la sortie de commande.

Exemple d’utilisation de la ligne de commande

La commande .dx settings peut être utilisée pour afficher des informations sur l’objet Paramètres de débogage. Pour plus d’informations sur les objets de paramètres de débogage, consultez .settings.

kd> dx -r1 Debugger.Settings
Debugger.Settings  
    Debug            
    Display           
    EngineInitialization 
    Extensions       
    Input             
    Sources           
    Symbols           
    AutoSaveSettings : false

Utilisez l’option de récursion -r1 pour afficher les autres objets Débogueur - Sessions, Paramètres et État.

kd> dx -r1 Debugger
Debugger  
  Sessions  
  Settings 
  State    
  Utility
  LastEvent 

Spécifiez l’objet Debugger.Sessions avec l’option de récursivité -r3 pour parcourir plus loin dans la chaîne d’objets.

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

Ajoutez le spécificateur de format x pour afficher les valeurs ordinales en hexadécimal.

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

Cet exemple utilise une session de débogage active pour répertorier la pile d’appels du premier thread du premier processus.

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

Utilisez l’option -g pour afficher la sortie sous forme de grille de données. Sélectionnez une colonne à trier.

kd> dx -g @$curprocess.Modules

Capture d’écran de la sortie de la commande dx -g @$curprocess.modules, affichant la sortie de la grille colonne.

Utilisez l’option -h pour afficher des informations sur les objets.

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

Affichage des informations TEB et PEB à l’aide de l’objet Environment

Utilisez l’objet Environment pour afficher les informations TEB et PEB associées au thread et au processus.

Pour afficher le TEB associé au thread actuel, utilisez cette commande.

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

Pour afficher le PEB associé au processus actuel, utilisez cette commande.

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

Objet Io.Handles noyau

Utilisez l’objet Io.Handles de processus actuel pour afficher les informations de handle du noyau.

0: kd> dx -r1 @$curprocess.Io.Handles
@$curprocess.Io.Handles                
    [0x8]           
    [0xc]           
    [0x10]          
    [0x14]          
    [0x18]       
    ...

Utilisez . Fonction First() pour afficher des informations sur le premier handle.

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

Notez que l’objet Io.Handles est un objet noyau uniquement.

Contourner les limitations des fichiers de symboles avec la conversion

Lorsque vous affichez des informations sur différentes variables système Windows, il arrive que toutes les informations de type ne soient pas disponibles dans les symboles publics. Cet exemple illustre cette situation.

0: kd> dx nt!PsIdleProcess
Error: No type (or void) for object at Address 0xfffff800e1d50128

La commande dx prend en charge la possibilité de référencer l’adresse d’une variable qui n’a pas d’informations de type. Ces références « adresse de » sont traitées comme « void * » et peuvent être castées comme telles. Cela signifie que si le type de données est connu, la syntaxe suivante peut être utilisée pour afficher les informations de type pour la variable.

dx (Datatype *)&VariableName

Par exemple pour un nt ! PsIdleProcess qui a un type de données nt !_EPROCESS, utilisez cette commande.

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]

La commande dx ne prend pas en charge le changement d’évaluateurs d’expression avec la syntaxe @@ MASM. Pour plus d’informations sur les évaluateurs d’expressions, consultez Évaluation des expressions.

Utilisation de LINQ avec les objets débogueur

La syntaxe LINQ peut être utilisée avec les objets de débogueur pour rechercher et manipuler des données. LINQ est conceptuellement similaire au langage SQL (SQL) utilisé pour interroger les bases de données. Vous pouvez utiliser plusieurs méthodes LINQ pour rechercher, filtrer et analyser des données de débogage. Pour plus d’informations sur l’utilisation de LINQ avec les objets débogueur, consultez Utilisation de LINQ avec les objets débogueur.

Utilisation d’objets débogueur avec NatVis et JavaScript

Pour plus d’informations sur l’utilisation d’objets débogueur avec NatVis, consultez Objets débogueur natifs dans NatVis.

Pour plus d’informations sur l’utilisation d’objets débogueur avec JavaScript, consultez Objets débogueur natifs dans les extensions JavaScript.

Voir aussi

Utilisation de LINQ avec les objets débogueur

Objets débogueur natifs dans NatVis

Objets débogueur natifs dans les extensions JavaScript