Share via


Débogage de voyage dans le temps - Relire une trace

Logo de débogage de voyage dans le temps avec une horloge.

Cette section explique comment relire les traces de voyage dans le temps, en naviguant vers l’avant et vers l’arrière dans le temps.

Navigation dans le temps des commandes

Utilisez un signe moins de fin avec les commandes suivantes pour remonter dans le temps.

Commande
p- (Retour en arrière)
t- (Trace Back)
g- (Retour en arrière)

Pour plus d’informations, consultez Débogage de voyage dans le temps - Commandes de navigation.

Navigation de voyage dans le temps du bouton du ruban

Vous pouvez également utiliser les boutons du ruban pour naviguer dans la trace.

Capture d’écran des boutons Aller, Revenir en arrière, Pas à pas et Retour en arrière dans le ruban.

Exemple de relecture de trace TTD

Utilisez la commande g- pour exécuter vers l’arrière jusqu’à ce qu’un événement ou le début de la trace TTD soit atteint. Les événements qui peuvent arrêter l’exécution descendante sont les mêmes qui arrêteraient l’exécution en avant. Dans cet exemple, le début de la trace est atteint.

0:000> g-
TTD: Start of trace reached.
(3f78.4274): Break instruction exception - code 80000003 (first/second chance not available)
Time Travel Position: 29:0
ntdll!ZwTestAlert+0x14:
00007ffc`61f789d4 c3              ret

Utilisez la commande p (Étape) pour avancer dans une trace TTD.

0:000> p
Time Travel Position: F:1
eax=0173a5b0 ebx=00fd8000 ecx=7774f821 edx=0f994afc esi=0f99137c edi=00de0000
eip=7774f828 esp=010ff34c ebp=010ff584 iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
ntdll!LdrpInitializeProcess+0x1bc5:
7774f828 740b            je      ntdll!LdrpInitializeProcess+0x1bd2 (7774f835) [br=1]
0:000> p
Time Travel Position: F:2
eax=0173a5b0 ebx=00fd8000 ecx=7774f821 edx=0f994afc esi=0f99137c edi=00de0000
eip=7774f835 esp=010ff34c ebp=010ff584 iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
ntdll!LdrpInitializeProcess+0x1bd2:
7774f835 83bdd0feffff00  cmp     dword ptr [ebp-130h],0 ss:002b:010ff454=00000000
0:000> p
Time Travel Position: F:3
eax=0173a5b0 ebx=00fd8000 ecx=7774f821 edx=0f994afc esi=0f99137c edi=00de0000
eip=7774f83c esp=010ff34c ebp=010ff584 iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
ntdll!LdrpInitializeProcess+0x1bd9:
7774f83c 0f8450e8ffff    je      ntdll!LdrpInitializeProcess+0x42f (7774e092) [br=1]

Vous pouvez également utiliser la commande t (Trace) pour naviguer dans la trace.

0:000> t
Time Travel Position: F:4
eax=0173a5b0 ebx=00fd8000 ecx=7774f821 edx=0f994afc esi=0f99137c edi=00de0000
eip=7774e092 esp=010ff34c ebp=010ff584 iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
ntdll!LdrpInitializeProcess+0x42f:
7774e092 33c0            xor     eax,eax
0:000> t
Time Travel Position: F:5
eax=00000000 ebx=00fd8000 ecx=7774f821 edx=0f994afc esi=0f99137c edi=00de0000
eip=7774e094 esp=010ff34c ebp=010ff584 iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
ntdll!LdrpInitializeProcess+0x431:
7774e094 e9f5170000      jmp     ntdll!LdrpInitializeProcess+0x1c2b (7774f88e)

Utilisez la commande p- pour revenir en arrière dans une trace TTD.

0:000> p-
Time Travel Position: F:4
eax=0173a5b0 ebx=00fd8000 ecx=7774f821 edx=0f994afc esi=0f99137c edi=00de0000
eip=7774e092 esp=010ff34c ebp=010ff584 iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
ntdll!LdrpInitializeProcess+0x42f:
7774e092 33c0            xor     eax,eax
0:000> p-
Time Travel Position: F:3
eax=0173a5b0 ebx=00fd8000 ecx=7774f821 edx=0f994afc esi=0f99137c edi=00de0000
eip=7774f83c esp=010ff34c ebp=010ff584 iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
ntdll!LdrpInitializeProcess+0x1bd9:
7774f83c 0f8450e8ffff    je      ntdll!LdrpInitializeProcess+0x42f (7774e092) [br=1]

Vous pouvez également utiliser la commande t- pour revenir en arrière dans le temps.

!tt commandes de navigation

Utilisez la commande !tt pour naviguer vers l’avant ou vers l’arrière dans le temps, en sautant à une position donnée dans la trace.

!tt [position]

Fournissez une position de temps dans l’un des formats suivants pour atteindre ce point dans le temps.

  • Si [position] est un nombre décimal compris entre 0 et 100, il atteint environ ce pourcentage dans la trace. Par exemple !tt 50 , voyage jusqu’à la moitié de la trace.

  • Si {position} a la valeur # :#, où # est un nombre hexadécimal, elle se déplace vers cette position. Par exemple, !tt 1A0:12F se déplace à la position 1A0 :12F dans la trace.

Pour plus d’informations, consultez Débogage des voyages dans le temps - !tt (voyage dans le temps).

!Positions

Utilisez !positions pour afficher tous les threads actifs, y compris leur position dans la trace. Pour plus d’informations, consultez Débogage des voyages dans le temps - !positions (voyage dans le temps).

0:000> !positions
>*Thread ID=0x1C74 - Position: F:2
 Thread ID=0x1750 - Position: A5:0
 Thread ID=0x3FFC - Position: 200:0
 Thread ID=0x36B8 - Position: 403:0
 Thread ID=0x3BC4 - Position: 5F2:0
 Thread ID=0x392C - Position: B45:0
 Thread ID=0x32B4 - Position: C87:0
 Thread ID=0x337C - Position: DF1:0
* indicates an actively running thread

Cet exemple montre qu’il existe huit threads à la position actuelle. Le thread actuel est 3604, marqué avec « ».>

Conseil

Une autre façon d’afficher la liste actuelle des threads et leurs positions consiste à utiliser la commande dx du modèle de données :

dx -g @$curprocess.Threads.Select(t => new { IsCurrent = t.Id == @$curthread.Id, ThreadId = t.Id, Position = t.TTD.Position })

Utilisez la commande mode utilisateur ~ (État du thread) qui affiche les mêmes huit threads et marque le thread actuel avec « . » :

0:000> ~
.  0  Id: 954.1c74 Suspend: 4096 Teb: 00fdb000 Unfrozen
   1  Id: 954.1750 Suspend: 4096 Teb: 00fea000 Unfrozen
   2  Id: 954.3ffc Suspend: 4096 Teb: 00fde000 Unfrozen
   3  Id: 954.36b8 Suspend: 4096 Teb: 00fe1000 Unfrozen
   4  Id: 954.3bc4 Suspend: 4096 Teb: 00fe4000 Unfrozen
   5  Id: 954.392c Suspend: 4096 Teb: 00fed000 Unfrozen
   6  Id: 954.32b4 Suspend: 4096 Teb: 00ff0000 Unfrozen
   7  Id: 954.337c Suspend: 4096 Teb: 00ff3000 Unfrozen

Dans la sortie de la commande !positions, cliquez sur le lien en regard du troisième thread (3FFC) pour parcourir le temps jusqu’à cette position dans la trace, 200 :0.

0:002> !tt 200:0
Setting position: 200:0
(954.3ffc): Break instruction exception - code 80000003 (first/second chance not available)
Time Travel Position: 200:0
eax=00000000 ebx=012da718 ecx=7775396c edx=00000000 esi=012e1848 edi=012e1a08
eip=7775396c esp=014cf9f8 ebp=014cfbfc iopl=0         nv up ei ng nz ac po cy
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000293
ntdll!NtWaitForWorkViaWorkerFactory+0xc:
7775396c c21400          ret     14h

Utilisez la commande ~ (État du thread) pour confirmer que nous sommes maintenant positionnés sur le troisième thread, 3ffc.

0:002> ~
   0  Id: 954.1c74 Suspend: 4096 Teb: 00fdb000 Unfrozen
   1  Id: 954.1750 Suspend: 4096 Teb: 00fea000 Unfrozen
.  2  Id: 954.3ffc Suspend: 4096 Teb: 00fde000 Unfrozen
   3  Id: 954.36b8 Suspend: 4096 Teb: 00fe1000 Unfrozen
   4  Id: 954.3bc4 Suspend: 4096 Teb: 00fe4000 Unfrozen
   5  Id: 954.392c Suspend: 4096 Teb: 00fed000 Unfrozen
   6  Id: 954.32b4 Suspend: 4096 Teb: 00ff0000 Unfrozen
   7  Id: 954.337c Suspend: 4096 Teb: 00ff3000 Unfrozen

Notes

Le ~s#, où # est un numéro de thread, bascule également vers le thread donné, mais il ne modifie pas la position actuelle dans la trace. Lorsque !tt est utilisé pour voyager dans le temps vers la position d’un autre thread, toutes les valeurs que vous (et le débogueur) avez lues à partir de la mémoire sont recherchées à cette position. Lors du basculement de threads avec ~s#, le débogueur ne modifie pas la position actuelle en interne, qui est utilisée pour toutes les requêtes de mémoire. Cela fonctionne principalement de cette façon afin que ~s# n’ait pas à réinitialiser la boucle interne du débogueur.

Commandes d’extension de débogage de voyage dans le temps

Pour plus d’informations sur , !tt!positions et les !index commandes, consultez Débogage de voyage dans le temps - Commandes d’extension.

Voir aussi

Débogage de voyage dans le temps - Vue d’ensemble

Débogage de voyage dans le temps - Enregistrer une trace

Débogage de voyage dans le temps - Utilisation des fichiers de trace

Débogage de voyage dans le temps - Exemple de procédure pas à pas d’application