dx (Afficher l’expression du modèle d’objet de débogage)

La commande dx affiche une expression C++ à l’aide du modèle d’extension NatVis. Pour en savoir plus 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 en tant qu’objets de grille de données qui sont itérables. Chaque élément itéré est une ligne dans la grille et chaque enfant affiché de ces éléments est une colonne. Cela vous permet d’afficher un élément comme un tableau de structs, dans lequel chaque élément du tableau est affiché dans une ligne et chaque champ de la structure est affiché dans une colonne.

La sélection d’un nom de colonne ( où un lien DML est disponible) permet d’effectuer un tri selon cette colonne. Si le tri selon cette colonne a déjà été effectué, l’ordre de tri sera inversé.

Tout objet itérable comportera un élément de menu contextuel à sélectionner et à maintenir (ou faire un clic droit) ajouté via DML et intitulé « Afficher sous forme de grille ». En sélectionnant et en maintenant (ou en faisant un clic droit) un objet dans la fenêtre de sortie et en sélectionnant ce dernier, il s’affiche dans la vue en grille au lieu de l’arborescence standard.

Le signe (+) affiché à côté du nom d’une colonne permet à la fois de sélectionner et de maintenir (ou de faire un clic droit) et de sélectionner.

  • La sélection prend cette colonne et la fait éclater dans son propre tableau. Vous voyez les lignes d’origine plus les enfants de la colonne développée.
  • La sélection et le maintien (ou le clic droit) permettent de « Développer dans la grille », qui prend la colonne et l’ajoute au tableau actuel comme colonne la plus à droite.

-gc #

Affichage sous forme de grille et limitation de la taille des cellules au nombre de caractères (#) spécifié.

-c # Affiche la suite du conteneur (en ignorant les éléments # de ce dernier). Cette option est généralement utilisée dans les scénarios d’automatisation des sorties personnalisées et fournit un élément de suite « ... » au bas de la liste.

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

-v

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

-r#

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

[<,Spécificateur de format>]

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

Spécificateur de format Description
,x Affichage des ordinaux en hexadécimal
,d Affichage des ordinaux en décimal
,o Affichage des ordinaux en octal
,b Affichage des ordinaux en binaire
,en Affichage des énumérations par leur nom uniquement (sans valeur)
c, Affichage sous forme de caractère unique (pas de chaîne)
,s Affichage des chaînes de 8 bits en tant que caractères ASCII entre guillemets
,sb Affichage des chaînes de 8 bits en tant que caractères ASCII sans guillemets
,s8 Affichage des chaînes 8 bits au format UTF-8 entre guillemets
,s8b Affichage des chaînes 8 bits au format UTF-8 sans guillemets
,su Affichage des chaînes 16 bits au format UTF-16 entre guillemets
,sub Affichage des chaînes 16 bits au format UTF-16 sans guillemets
,! Affichage des objets en mode brut uniquement (par exemple, non NatVis)
, # Spécification de la longueur du pointeur/tableau/conteneur comme valeur littérale # (remplacer par numérique)
,[<expression>] Spécification de la longueur du pointeur/tableau/conteneur comme l’expression <expression>
,nd Le type dérivé (runtype) de l’objet n’est pas trouvé. Afficher la valeur statique uniquement

dx - ?

Afficher l’aide de 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 du modèle de données dans la sortie de la commande.

Exemple d’utilisation en ligne de commande

La commande paramètres .dx peut être utilisée pour afficher des informations sur l’objet Paramètres de débogage. Pour en savoir plus 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écursivité -r1 pour afficher les autres objets du 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 descendre plus bas 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 des 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 la 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 en colonnes.

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

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

Utilisez l’objet Environment pour afficher les informations sur le TEB et le PEB associés 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 du noyau

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

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

Utilisez la 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

Il convient de noter que l’objet Io.Handles est un objet noyau uniquement.

Contourner les limitations des fichiers de symboles avec la conversion

Lors de l’affichage d’informations sur diverses variables du 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 capacité de référencer l’adresse d’une variable qui n’a pas d’informations de type. De telles références « adresse de » sont traitées comme « vides * » et peuvent être castées en tant que telles. Cela signifie que si le type de données est connu, la syntaxe suivante peut être utilisée pour afficher des informations de type pour la variable.

dx (Datatype *)&VariableName

Ainsi pour un nt!PsIdleProcess qui a un type de donnée du 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 en savoir plus sur les évaluateurs d’expressions, consultez Évaluation des expressions.

Utilisation de LINQ avec les objets du débogueur

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

Utilisation d’objets du débogueur avec NatVis et JavaScript

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

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

Voir aussi

Utilisation de LINQ avec les objets du débogueur

Objets du débogueur natif dans NatVis

Objets du débogueur natif dans les extensions JavaScript