Bagikan melalui


Debugging Perjalanan Waktu - Memutar Ulang Jejak

Logo debugging perjalanan waktu yang menampilkan jam.

Bagian ini menjelaskan cara memutar ulang jejak perjalanan waktu, menavigasi maju, dan mundur dalam waktu.

Perintah navigasi perjalanan waktu

Gunakan tanda minus di akhir dengan perintah berikut untuk melakukan perjalanan ke masa lampau.

Perintah
p- (Langkah Mundur)
t- (Telusuri Kembali)
g- (Kembali)

Untuk informasi selengkapnya, lihat Debugging Perjalanan Waktu - Perintah Navigasi.

Navigasi perjalanan waktu tombol pita

Atau, gunakan tombol pita untuk menavigasi dalam jejak.

Cuplikan layar tombol Buka, Kembali, Langkah, dan Mundur di pita.

Contoh Pemutaran Ulang Pelacakan TTD

Gunakan perintah g- untuk mengeksekusi mundur hingga suatu peristiwa terjadi atau sampai awal rekaman TTD tercapai. Peristiwa yang dapat menghentikan eksekusi mundur adalah sama yang akan menghentikan eksekusi ke depan. Dalam contoh ini, sudah mencapai awal jejak.

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

Gunakan perintah p (Langkah) untuk melangkah maju dalam jejak TTD.

0:000> p
Time Travel Position: F:1
ntdll!LdrpInitializeProcess+0x1bc5:
7774f828 740b            je      ntdll!LdrpInitializeProcess+0x1bd2 (7774f835) [br=1]
0:000> p
Time Travel Position: F:2
ntdll!LdrpInitializeProcess+0x1bd2:
7774f835 83bdd0feffff00  cmp     dword ptr [ebp-130h],0 ss:002b:010ff454=00000000
0:000> p
Time Travel Position: F:3
ntdll!LdrpInitializeProcess+0x1bd9:
7774f83c 0f8450e8ffff    je      ntdll!LdrpInitializeProcess+0x42f (7774e092) [br=1]

Anda juga dapat menggunakan perintah t (Trace) untuk menavigasi dalam pelacakan.

0:000> t
Time Travel Position: F:4
ntdll!LdrpInitializeProcess+0x42f:
7774e092 33c0            xor     eax,eax
0:000> t
Time Travel Position: F:5
ntdll!LdrpInitializeProcess+0x431:
7774e094 e9f5170000      jmp     ntdll!LdrpInitializeProcess+0x1c2b (7774f88e)

Gunakan perintah p- untuk melangkah mundur dalam jejak TTD.

0:000> p-
Time Travel Position: F:4
ntdll!LdrpInitializeProcess+0x42f:
7774e092 33c0            xor     eax,eax
0:000> p-
Time Travel Position: F:3
ntdll!LdrpInitializeProcess+0x1bd9:
7774f83c 0f8450e8ffff    je      ntdll!LdrpInitializeProcess+0x42f (7774e092) [br=1]

Anda juga dapat menggunakan perintah t- untuk menavigasi mundur dalam waktu.

!tt perintah navigasi

Gunakan perintah !tt untuk menavigasi maju atau mundur dalam waktu, dengan melompat ke posisi tertentu dalam pelacakan.

!tt [posisi]

Berikan posisi waktu dalam salah satu format berikut untuk melakukan perjalanan ke titik waktu tersebut.

  • Jika [posisi] adalah angka desimal antara 0 dan 100, maka ia bergerak ke persentase yang kira-kira sesuai di dalam lintasan. Misalnya !tt 50 berpergian hingga setengah jalan melalui lintasan.

  • Jika {position} adalah #:#, di mana # adalah angka heksadesimal, ia akan menuju ke posisi tersebut. Misalnya, !tt 1A0:12F bergerak ke posisi 1A0:12F dalam pelacakan.

Untuk informasi lebih lanjut, lihat Debugging Perjalanan Waktu - !tt (time travel).

!posisi

Gunakan !positions untuk menampilkan semua utas aktif, termasuk posisinya dalam pelacakan. Untuk informasi selengkapnya, lihat Time Travel Debugging - !positions (time travel).

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

Contoh ini menunjukkan bahwa ada delapan utas pada posisi saat ini. Thread saat ini adalah 3604, ditandai dengan '>'.

Petunjuk / Saran

Cara lain untuk menampilkan daftar utas saat ini dan posisinya adalah dengan menggunakan perintah model data dx:

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

Gunakan perintah mode pengguna ~ (Status Utas) menunjukkan delapan utas yang sama, dan menandai utas saat ini dengan '.':

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

Dalam output perintah !positions, klik tautan di samping utas ketiga (3FFC) untuk melompat ke posisi tersebut dalam jejak waktu, 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
ntdll!NtWaitForWorkViaWorkerFactory+0xc:
7775396c c21400          ret     14h

Gunakan perintah ~ (Status Utas) untuk mengonfirmasi bahwa kita sekarang diposisikan di utas ketiga, 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#, di mana # adalah nomor utas, juga beralih ke utas yang ditentukan, tetapi tidak mengubah posisi saat ini dalam jejak. Ketika !tt digunakan untuk melakukan perjalanan waktu ke posisi thread lain, nilai apa pun yang Anda (dan debugger) baca dari memori akan diakses pada posisi tersebut. Saat beralih utas dengan ~s#, debugger tidak mengubah posisi saat ini secara internal, yang digunakan untuk semua kueri memori. Ini bekerja dengan cara ini terutama sehingga ~s# tidak perlu mengatur ulang perulangan dalam debugger.

Perintah ekstensi debugging perjalanan waktu

Untuk informasi tentang perintah-perintah !tt, !positions, dan !index, silakan lihat Penelusuran Kesalahan Perjalanan Waktu - Perintah Ekstensi.

Lihat Juga

Debugging Perjalanan Waktu - Gambaran Umum

Debugging dengan Perjalanan Waktu - Merekam pelacakan

Time Travel Debugging - Bekerja dengan file jejak

Debugging dengan Perjalanan Waktu - Panduan Aplikasi Contoh