wt (Trace and Watch Data)
La commande wt s’exécute via l’ensemble de la fonction, puis affiche des statistiques, lorsque vous exécutez cette commande au début d’un appel de fonction.
wt [WatchOptions] [= StartAddress] [EndAddress]
Paramètres
WatchOptions
Spécifie comment modifier l’affichage. Vous pouvez utiliser l’une des options suivantes.
Option | Résultat |
---|---|
-l Profondeur |
(Mode utilisateur uniquement) Spécifie la profondeur maximale des appels à afficher. Tous les appels qui sont au moins plus profonds que le point de départ sont exécutés en mode silencieux. |
-m Module |
(Mode utilisateur uniquement) Limite l’affichage au code à l’intérieur du module spécifié, ainsi que le premier niveau d’appels effectués à partir de ce module. Vous pouvez inclure plusieurs options -m pour afficher du code à partir de plusieurs modules et aucun autre module. |
-i Module |
(Mode utilisateur uniquement) Ignore tout code dans le module spécifié. Vous pouvez inclure plusieurs options -i pour ignorer le code de plusieurs modules. Si vous utilisez une option -m, le débogueur ignore toutes les options -i. |
-ni |
(Mode utilisateur uniquement) N’affiche aucune entrée dans le code qui est ignorée en raison d’une option -m ou -i. |
-Nc |
N’affiche pas les informations d’appel individuelles. |
-Ns |
N’affiche pas d’informations récapitulatives. |
-Nw |
N’affiche pas d’avertissements pendant la trace. |
-Oa |
(Mode utilisateur uniquement) Affiche l’adresse réelle des sites d’appel. |
-or |
(Mode utilisateur uniquement) Affiche les valeurs de registre de retour de la fonction appelée, à l’aide du radix par défaut comme base. |
-ou |
(Mode utilisateur uniquement) Affiche les valeurs de registre de retour de la fonction appelée, dans le type approprié pour chaque valeur de retour. |
StartAddress
Spécifie l’adresse à laquelle le débogueur commence l’exécution. Si vous n’utilisez pas StartAddress, l’exécution commence à l’instruction pointée par le pointeur d’instruction. Pour plus d’informations sur la syntaxe, consultez la syntaxe d’adresse et de plage d’adresses.
EndAddress
Spécifie l’adresse à laquelle le suivi se termine. Si vous n’utilisez pas EndAddress, un seul appel d’instruction ou de fonction est exécuté.
Environnement
Les modes |
Mode utilisateur, mode noyau |
Targets |
Débogage en direct uniquement |
Platforms |
Mode utilisateur : tout le mode noyau : x86 uniquement |
Informations supplémentaires
Pour plus d’informations sur l’émission de la commande wt et une vue d’ensemble des commandes associées, consultez Contrôle de la cible.
Notes
La commande wt est utile si vous souhaitez obtenir des informations sur le comportement d’une fonction spécifique, mais vous ne souhaitez pas parcourir la fonction. Au lieu de cela, accédez au début de cette fonction, puis émettez la commande wt .
Si le compteur de programme se trouve à un point qui correspond à un symbole (tel que le début d’une fonction ou d’un point d’entrée dans un module), la commande wt trace jusqu’à ce qu’elle atteigne l’adresse de retour actuelle. Si le compteur de programme se trouve sur une instruction d’appel, la commande wt trace jusqu’à ce qu’elle retourne à l’emplacement actuel. Ce suivi est profilé dans la fenêtre Commande du débogueur avec la sortie qui décrit les différents appels rencontrés par la commande.
Si la commande wt est émise ailleurs que le début d’une fonction, la commande se comporte comme la commande p (Étape). Toutefois, si vous spécifiez EndAddress, l’exécution continue jusqu’à ce que cette adresse soit atteinte, même si cette exécution implique de nombreuses étapes de programme et appels de fonction.
Lorsque vous déboguez en mode source, vous devez effectuer une trace dans la fonction uniquement au point où vous voyez le crochet ouvrant du corps de la fonction. Ensuite, vous pouvez utiliser la commande wt . (Il est généralement plus facile d’insérer un point d’arrêt à la première ligne de la fonction, ou d’utiliser Déboguer | Exécutez le curseur, puis utilisez la commande wt .)
Étant donné que la sortie de wt peut être longue, vous pouvez utiliser un fichier journal pour enregistrer votre sortie.
L’exemple suivant montre un fichier journal classique.
0:000> l+ Source options set to show source lines
Source options are f:
1/t - Step/trace by source line
2/l - List source line for LN and prompt
4/s - List source code at prompt
8/o - Only show source code at prompt
0:000> p Not yet at the function call: use "p"
> 44: minorVariableOne = 12;
0:000> p
> 45: variableOne = myFunction(2, minorVariable);
0:000> t At the function call: now use "t"
MyModule!ILT+10(_myFunction):
0040100f e9cce60000 jmp MyModule!myFunction (0040f6e0)
0:000> t
> 231: {
0:000> wt At the function beginning: now use "wt"
Tracing MyModule!myFunction to return address 00401137
105 0 [ 0] MyModule!myFunction
1 0 [ 1] MyModule!ILT+1555(_printf)
9 0 [ 1] MyModule!printf
1 0 [ 2] MyModule!ILT+370(__stbuf)
11 0 [ 2] MyModule!_stbuf
1 0 [ 3] MyModule!ILT+1440(__isatty)
14 0 [ 3] MyModule!_isatty
50 15 [ 2] MyModule!_stbuf
17 66 [ 1] MyModule!printf
1 0 [ 2] MyModule!ILT+980(__output)
59 0 [ 2] MyModule!_output
39 0 [ 3] MyModule!write_char
111 39 [ 2] MyModule!_output
39 0 [ 3] MyModule!write_char
....
11 0 [ 5] kernel32!__SEH_epilog4
54 11675 [ 4] kernel32!ReadFile
165 11729 [ 3] MyModule!_read
100 11895 [ 2] MyModule!_filbuf
91 11996 [ 1] MyModule!fgets
54545 83789 [ 0] MyModule!myFunction
1 0 [ 1] MyModule!ILT+1265(__RTC_CheckEsp)
2 0 [ 1] MyModule!_RTC_CheckEsp
54547 83782 [ 0] MyModule!myFunction
112379 instructions were executed in 112378 events (0 from other threads)
Function Name Invocations MinInst MaxInst AvgInst
MyModule!ILT+1265(__RTC_CheckEsp) 1 1 1 1
MyModule!ILT+1440(__isatty) 21 1 1 1
MyModule!ILT+1540(__ftbuf) 21 1 1 1
....
ntdll!memcpy 24 1 40 19
ntdll!memset 2 29 29 29
23 system calls were executed
Calls System Call
23 ntdll!KiFastSystemCall
Dans la liste de la trace, le premier nombre spécifie le nombre d’instructions exécutées, le deuxième nombre spécifie le nombre d’instructions exécutées par les processus enfants de la fonction, et le troisième nombre (entre crochets) spécifie la profondeur de la fonction dans la pile (prenant la fonction initiale comme zéro). La mise en retrait du nom de la fonction affiche la profondeur de l’appel.
Dans l’exemple précédent, MyModule !myFunction exécute 105 instructions avant d’appeler plusieurs sous-routines, notamment printf et fgets, puis exécute 54545 instructions supplémentaires après avoir appelé ces fonctions, mais avant d’émettre quelques appels supplémentaires. Toutefois, dans le nombre final, l’affichage indique que myFunction exécute 112 379 instructions, car ce nombre inclut toutes les instructions que myFunction et ses enfants exécutent. (Les enfants de myFunction sont des fonctions appelées à partir de myFunction, directement ou indirectement.)
Dans l’exemple précédent, notez également que l’ILT+1440 (__isatty) est appelé 21 fois. Dans le nombre final, le résumé du comportement de cette fonction indique le nombre de fois où elle a été appelée, le plus petit nombre d’instructions dans une seule exécution, le plus grand nombre d’instructions dans n’importe quelle exécution unique et le nombre moyen d’instructions par exécution.
Si des appels système sont effectués, ils apparaissent dans le compteur et sont répertoriés à la fin de la sortie de commande.