Condividi tramite


Debug di viaggi temporali - Riprodurre una traccia

Logo di debug di viaggi in tempo con un orologio.

In questa sezione viene descritto come riprodurre le tracce di viaggio temporale, spostarsi avanti e indietro nel tempo.

Spostamento tempo di spostamento in tempo di comando

Usare un segno meno finale con i comandi seguenti per tornare indietro nel tempo.

Comando
p- (passo indietro)
t- (traccia indietro)
g- (Torna indietro)

Per altre informazioni, vedere Debug di viaggi temporali - Comandi di spostamento.

Navigazione del tempo di spostamento del pulsante della barra multifunzione

In alternativa, usare i pulsanti della barra multifunzione per spostarsi nella traccia.

Screenshot dei pulsanti Go, Torna indietro, Passaggio e Indietro nella barra multifunzione.

Riesecuzione di traccia TTD di esempio

Usare il comando g- per eseguire all'indietro fino a quando non viene raggiunto un evento o l'inizio della traccia TTD. Gli eventi che possono arrestare l'esecuzione indietro sono gli stessi che interromperebbero l'esecuzione in avanti. In questo esempio viene raggiunto l'inizio della traccia.

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

Usare il comando p (passaggio) per eseguire l'avanzamento in una traccia 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]

È anche possibile usare il comando t (Traccia) per spostarsi nella traccia.

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)

Usare il comando p- per eseguire il passaggio indietro in una traccia 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]

È anche possibile usare il comando t- per spostarsi indietro nel tempo.

Comandi di spostamento !tt

Usare il comando !tt per spostarsi avanti o indietro nel tempo, ignorando una determinata posizione nella traccia.

!tt [posizione]

Specificare una posizione temporale in uno dei formati seguenti per spostarsi in quel momento.

  • Se [posizione] è un numero decimale compreso tra 0 e 100, passa a circa tale percentuale nella traccia. Ad esempio !tt 50 , viaggia a metà strada attraverso la traccia.

  • Se {position} è #:#, dove # sono numeri esadecimali, si sposta in tale posizione. Ad esempio, !tt 1A0:12F passa alla posizione 1A0:12F nella traccia.

Per altre informazioni, vedere Debug di viaggi temporali - !tt (viaggio temporale) .

!Posizioni

Usare !positions per visualizzare tutti i thread attivi, inclusa la posizione nella traccia. Per altre informazioni, vedere Debug di viaggi temporali - !posizioni (viaggio temporale) .

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

Questo esempio mostra che sono presenti otto thread nella posizione corrente. Il thread corrente è 3604, contrassegnato con '>'.

Suggerimento

Un altro modo per visualizzare l'elenco corrente di thread e le relative posizioni, consiste nell'usare il comando dx del modello di dati:

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

Usare il comando modalità utente ~ (Stato thread) mostra gli stessi otto thread e contrassegna il thread corrente con '.':

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

Nell'output dei comandi !position fare clic sul collegamento accanto al terzo thread (3FFC), per spostarsi in tempo in tale posizione nella traccia, 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

Usare il comando ~ (Stato thread) per confermare che ora siamo posizionati al terzo 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

Nota

~s#, dove # è un numero di thread, passa anche al thread specificato, ma non cambia la posizione corrente nella traccia. Quando !tt viene usato per viaggiare in tempo alla posizione di un altro thread, tutti i valori letti dalla memoria verranno esaminati in tale posizione. Quando si passano thread con ~s#, il debugger non modifica la posizione corrente internamente, che viene usata per tutte le query di memoria. Ciò funziona principalmente in modo che ~s# non sia necessario reimpostare il ciclo interno del debugger.

Comandi di estensione per il debug del tempo

Per informazioni su !tte !positions i !index comandi, vedere Time Travel Debug - Comandi di estensione.

Vedere anche

Debug di viaggi temporali - Panoramica

Debug di viaggi temporali - Registrare una traccia

Debug di viaggi temporali - Uso dei file di traccia

Debug di viaggi temporali - Procedura dettagliata dell'app di esempio