Freigeben über


Debuggen von Zeitreisen – Wiedergeben einer Ablaufverfolgung

Debugging-Logo für Zeitreisen mit einer Uhr.

In diesem Abschnitt wird beschrieben, wie Sie Zeitreiseablaufverfolgungen wiedergeben und in der Zeit vorwärts und rückwärts navigieren.

Befehlszeitreisenavigation

Verwenden Sie ein nachfolgendes Minuszeichen mit den folgenden Befehlen, um in die Zeit zurück zu reisen.

Get-Help
p- (Schritt zurück)
t- (Zurückverfolgen)
g- (Zurück)

Weitere Informationen finden Sie unter Debuggen von Zeitreisen – Navigationsbefehle.

Menübandschaltfläche Zeitreisenavigation

Alternativ können Sie über die Menübandschaltflächen in der Ablaufverfolgung navigieren.

Screenshot der Schaltflächen

TTD-Ablaufverfolgungs-Beispielwiedergabe

Verwenden Sie den g-Befehl, um rückwärts auszuführen, bis entweder ein Ereignis oder der Anfang der TTD-Ablaufverfolgung erreicht ist. Die Ereignisse, die die Rückwärtsausführung beenden können, sind dieselben, die die Vorwärtsausführung beenden würden. In diesem Beispiel wird der Beginn der Ablaufverfolgung erreicht.

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

Verwenden Sie den Befehl p (Step), um in einer TTD-Ablaufverfolgung einen Schritt vorwärts zu gehen.

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]

Sie können auch den Befehl t (Trace) verwenden, um in der Ablaufverfolgung zu navigieren.

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)

Verwenden Sie den Befehl p-, um in einer TTD-Ablaufverfolgung rückwärts zu treten.

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]

Sie können auch den Befehl t- verwenden, um rechtzeitig rückwärts zu navigieren.

!tt-Navigationsbefehle

Verwenden Sie den Befehl !tt, um rechtzeitig vorwärts oder rückwärts zu navigieren, indem Sie zu einer bestimmten Position in der Ablaufverfolgung überspringen.

!tt [Position]

Stellen Sie eine Zeitposition in einem der folgenden Formate bereit, um zu diesem Zeitpunkt zu reisen.

  • Wenn [Position] eine Dezimalzahl zwischen 0 und 100 ist, wird sie ungefähr zu diesem Prozent in die Ablaufverfolgung übertragen. So wird z. B !tt 50 . zur Hälfte der Ablaufverfolgung weitergeleitet.

  • Wenn {position} #:#ist, wobei # hexadezimale Zahlen sind, wird sie an diese Position übertragen. !tt 1A0:12F Beispielsweise wird in der Ablaufverfolgung an position 1A0:12F übertragen.

Weitere Informationen finden Sie unter Debuggen von Zeitreisen – !tt (Zeitreise).

!Positionen

Verwenden Sie !positions , um alle aktiven Threads anzuzeigen, einschließlich ihrer Position in der Ablaufverfolgung. Weitere Informationen finden Sie unter Debuggen von Zeitreisen – !positions (Zeitreise).

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

Dieses Beispiel zeigt, dass es an der aktuellen Position acht Threads gibt. Der aktuelle Thread ist 3604 und mit ""> gekennzeichnet.

Tipp

Eine weitere Möglichkeit zum Anzeigen der aktuellen Liste der Threads und deren Positionen besteht darin, den Dx-Befehl für das Datenmodell zu verwenden:

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

Verwenden Sie den Befehl Benutzermodus ~ (Threadstatus) zeigt die gleichen acht Threads an, und markieren Sie den aktuellen Thread mit ".":

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

Klicken Sie in der Befehlsausgabe !positions auf den Link neben dem dritten Thread (3FFC), um die Zeit zu dieser Position in der Ablaufverfolgung zu reisen, 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

Verwenden Sie den Befehl ~ (Threadstatus), um zu bestätigen, dass wir jetzt am dritten Thread 3ffc positioniert sind.

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

Hinweis

Das ~s#, wobei # eine Threadnummer ist, wechselt ebenfalls zum angegebenen Thread, ändert aber nicht die aktuelle Position in der Ablaufverfolgung. Wenn !tt verwendet wird, um die Zeit zur Position eines anderen Threads zu verschieben, werden alle Werte, die Sie (und der Debugger) aus dem Arbeitsspeicher lesen, an dieser Position nachgeschlagen. Beim Wechseln von Threads mit ~s# ändert der Debugger nicht intern die aktuelle Position, die für alle Speicherabfragen verwendet wird. Dies funktioniert in erster Linie so, dass ~s# die innere Schleife des Debuggers nicht zurücksetzen muss.

Debug-Erweiterungsbefehle für Zeitreisen

Informationen zu den !tt- !positions und den !index Befehlen finden Sie unter Debuggen von Zeitreisen – Erweiterungsbefehle.

Weitere Informationen

Debuggen von Zeitreisen – Übersicht

Debuggen von Zeitreisen– Aufzeichnen einer Ablaufverfolgung

Debuggen von Zeitreisen : Arbeiten mit Ablaufverfolgungsdateien

Debuggen von Zeitreisen – Exemplarische Vorgehensweise für die App