Partager via


x (Examiner les symboles)

La commande x affiche les symboles dans tous les contextes qui correspondent au modèle spécifié.

x [Options] Module!Symbol 
x [Options] *

Paramètres

Options Spécifie les options de recherche de symboles. Vous pouvez utiliser une ou plusieurs des options suivantes :

/0
Affiche uniquement l’adresse de chaque symbole.

/1
Affiche uniquement le nom de chaque symbole.

/2
Affiche uniquement l’adresse et le nom de chaque symbole (et non le type de données).

/D
Affiche la sortie à l’aide du langage de balisage du débogueur.

/t
Affiche le type de données de chaque symbole, si le type de données est connu.

/C
Affiche le type de symbole (local, global, paramètre, fonction ou inconnu) de chaque symbole. Cette option affiche également la taille de chaque symbole. La taille d’un symbole de fonction est la taille de la fonction en mémoire. La taille des autres symboles est la taille du type de données que le symbole représente. La taille est toujours mesurée en octets et affichée au format hexadécimal.

Taille /s
Affiche uniquement les symboles dont la taille, en octets, est égale à la valeur size. La taille d’un symbole de fonction est la taille de la fonction en mémoire. La taille des autres symboles est la taille du type de données que le symbole représente. Les symboles dont la taille ne peut pas être déterminée sont toujours affichés. La taille doit être un entier différent de zéro.

/Q
Affiche les noms de symboles au format entre guillemets.

/p
Omet l’espace avant la parenthèse ouvrante lorsque le débogueur affiche un nom de fonction et ses arguments. Ce type d’affichage peut faciliter la copie de noms de fonctions et d’arguments de l’affichage x vers un autre emplacement.

/f
Affiche la taille des données d’une fonction.

/d
Affiche la taille des données.

/Un
Trie l’affichage par adresse, dans l’ordre croissant.

/Un
Trie l’affichage par adresse, dans l’ordre décroissant.

/n
Trie l’affichage par nom, dans l’ordre croissant.

/¡n
Trie l’affichage par nom, dans l’ordre décroissant.

/Z
Trie l’affichage par taille, dans l’ordre croissant.

/Z
Trie l’affichage par taille, dans l’ordre décroissant.

Module
Spécifie le module à rechercher. Ce module peut être un fichier .exe, .dll ou .sys. Le module peut contenir divers caractères génériques et spécificateurs. Pour plus d’informations sur la syntaxe, consultez Syntaxe de caractères génériques de chaîne.

Symbole
Spécifie un modèle que le symbole doit contenir. Le symbole peut contenir divers caractères génériques et spécificateurs. Pour plus d’informations sur la syntaxe, consultez Syntaxe de caractères génériques de chaîne.

Étant donné que ce modèle est mis en correspondance avec un symbole, la correspondance ne respecte pas la casse et un trait de soulignement de début unique (_) représente toute quantité de traits de soulignement de début. Vous pouvez ajouter des espaces dans Symbole, afin de pouvoir spécifier des noms de symboles qui contiennent des espaces (par exemple, « opérateur nouveau » ou « Modèle<A, B> ») sans utiliser de caractères génériques.

Environnement

Élément Description
Modes Mode utilisateur, mode noyau
Targets Vidage en direct sur incident
Plateformes Tous

Remarques

La commande suivante recherche tous les symboles dans MyModule qui contiennent la chaîne « spin ».

0:000> x mymodule!*spin* 

La commande suivante localise rapidement les symboles « DownloadMinor » et « DownloadMajor » dans MyModule.

0:000> x mymodule!downloadm??or 

Vous pouvez également afficher tous les symboles dans MyModule à l’aide de la commande suivante.

0:000> x mymodule!* 

Les commandes précédentes forcent également le débogueur à recharger les informations de symbole à partir de MyModule. Si vous souhaitez recharger les symboles dans le module avec un affichage minimal, utilisez la commande suivante.

0:000> x mymodule!*start* 

Quelques symboles contiennent toujours la chaîne « start ». Par conséquent, la commande précédente affiche toujours une sortie pour vérifier que la commande fonctionne. Mais la commande précédente évite la longueur d’affichage excessive de x mymodule !*.

L’affichage affiche l’adresse de départ de chaque symbole et le nom complet du symbole. Si le symbole est un nom de fonction, l’affichage inclut également une liste de ses types d’arguments. Si le symbole est une variable globale, sa valeur actuelle s’affiche.

Il existe un autre cas particulier de la commande x . Pour afficher les adresses et les noms de toutes les variables locales pour le contexte actuel, utilisez la commande suivante.

0:000> x * 

Note Dans la plupart des cas, vous ne pouvez pas accéder aux variables locales, sauf si des symboles privés ont été chargés. Pour plus d’informations sur cette situation, consultez dbgerr005 : Symboles privés requis. Pour afficher les valeurs des variables locales, utilisez la commande dv (Afficher les variables locales).

L’exemple suivant illustre les options /0, /1 et /2 .

0:000:x86> x /0 MyApp!Add*
00b51410          
00b513d0 
      
0:000:x86> x /1 MyApp!Add*
MyApp!AddThreeIntegers
MyApp!AddTwoIntegers

0:000:x86> x /2 MyApp!Add*
00b51410          MyApp!AddThreeIntegers
00b513d0          MyApp!AddTwoIntegers

Les options /0, /1 et /2 sont utiles si vous souhaitez utiliser la sortie de la commande x comme entrée de la commande .foreach .

.foreach ( place { x /0 MyApp!*MySym*} ) { .echo ${place}+0x18 }

L’exemple suivant illustre le commutateur /f lorsqu’il est utilisé pour filtrer des fonctions sur le module notepad.exe.

0:000> x /f /v notepad!*main*
prv func   00000001`00003340  249 notepad!WinMain (struct HINSTANCE__ *, struct HINSTANCE__ *, char *, int)
prv func   00000001`0000a7b0   1c notepad!WinMainCRTStartup$filt$0 (void)
prv func   00000001`0000a540  268 notepad!WinMainCRTStartup (void)

Lorsque vous utilisez l’option /v , la première colonne de l’affichage affiche le type de symbole (local, global, paramètre, fonction ou inconnu). La deuxième colonne est l’adresse du symbole. La troisième colonne est la taille du symbole, en octets. La quatrième colonne affiche le nom du module et le nom du symbole. Dans certains cas, cet affichage est suivi d’un signe égal (=), puis du type de données du symbole. La source du symbole (informations publiques ou complètes sur le symbole) est également affichée.

kd> x /v nt!CmType*
global 806c9e68    0 nt!CmTypeName = struct _UNICODE_STRING []
global 806c9e68  150 nt!CmTypeName = struct _UNICODE_STRING [42]
global 806c9e68    0 nt!CmTypeName = struct _UNICODE_STRING []
global 805bd7b0    0 nt!CmTypeString = unsigned short *[]
global 805bd7b0   a8 nt!CmTypeString = unsigned short *[42]

Dans l’exemple précédent, la taille est donnée au format hexadécimal, tandis que le type de données est donné au format décimal. Par conséquent, dans la dernière ligne de l’exemple précédent, le type de données est un tableau de 42 pointeurs vers des entiers courts non signés. La taille de ce tableau est 42*4 = 168, et 168 est affiché au format hexadécimal comme 0xA8.

Vous pouvez utiliser l’option Taille/s pour afficher uniquement les symboles dont la taille, en octets, est une certaine valeur. Par exemple, vous pouvez limiter la commande de l’exemple précédent aux symboles qui représentent des objets dont la taille est 0xA8.

kd> x /v /s a8 nt!CmType*
global 805bd7b0   a8 nt!CmTypeString = unsigned short *[42]

Utilisation des types de données

L’option /t permet au débogueur d’afficher des informations sur le type de données de chaque symbole. Notez que pour de nombreux symboles, ces informations s’affichent même sans l’option /t . Lorsque vous utilisez /t, ces symboles ont leurs informations de type de données affichées deux fois.

0:001> x prymes!__n*
00427d84 myModule!__nullstring = 0x00425de8 "(null)"
0042a3c0 myModule!_nstream = 512
Type information missing error for _nh_malloc
004021c1 myModule!MyStructInstance = struct MyStruct
00427d14 myModule!_NLG_Destination = <no type information>

0:001> x /t prymes!__n*
00427d84 char * myModule!__nullstring = 0x00425de8 "(null)"
0042a3c0 int myModule!_nstream = 512
Type information missing error for _nh_malloc
004021c1 struct MyStruct myModule!MyStructInstance = struct MyStruct
00427d14 <NoType> myModule!_NLG_Destination = <no type information>

La commande x affiche une instance d’un type.

0:001> x foo!MyClassInstance
00f4f354          foo!MyClassInstance = 0x00f78768

La commande x n’affiche aucun élément basé uniquement sur le nom d’un type.

0:001> x foo!MyClass
0:001>

Pour afficher les informations de type à l’aide du nom d’un type, envisagez d’utiliser dt (Type d’affichage), il fournit des informations pour les types et les instances de types :

0:001> dt foo!MyClass
   +0x000 IntMemberVariable : Int4B
   +0x004 FloatMemberVariable : Float
   +0x008 BoolMemberVariable : Bool
   +0x00c PtrMemberVariable : Ptr32 MyClass

Utilisation des modèles

Vous pouvez utiliser des caractères génériques avec la commande x pour afficher des classes de modèle, comme indiqué dans cet exemple.

0:001>  x Fabric!Common::ConfigEntry*TimeSpan?
000007f6`466a2f9c Fabric!Common::ConfigEntry<Common::TimeSpan>::ConfigEntry<Common::TimeSpan> (void)
000007f6`466a3020 Fabric!Common::ConfigEntry<Common::TimeSpan>::~ConfigEntry<Common::TimeSpan> (void)

Envisagez d’utiliser la commande dt (type d’affichage) lorsque vous utilisez des modèles, car la commande x n’affiche pas d’éléments de classe de modèle individuels.

0:001> dt foo!Common::ConfigEntry<Common::TimeSpan>
   +0x000 __VFN_table : Ptr64 
   +0x008 componentConfig_ : Ptr64 Common::ComponentConfig
   +0x010 section_         : std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >
   +0x038 key_             : std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >

Voir aussi

Vérification des symboles

dv (Afficher les variables locales)