Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Ekstensi debugger !tt (perjalanan waktu) yang memungkinkan Anda menavigasi waktu maju dan mundur.
!tt perintah navigasi
Gunakan ekstensi !tt untuk menavigasi maju atau mundur dalam waktu, dengan melakukan perjalanan ke posisi tertentu dalam pelacakan.
!tt [position]
Parameter-parameternya
posisi
Berikan posisi waktu dalam salah satu format berikut untuk melakukan perjalanan ke titik waktu tersebut.
Jika {position} adalah angka desimal antara 0 dan 100, nilai tersebut akan bergerak ke sekitar persentase itu ke dalam jejak. Contohnya:
- !tt 0 - Perjalanan waktu ke awal jejak
- !tt 50 - Perjalanan waktu ke setengah jalan melalui jejak
- !tt 100 - Perjalanan waktu ke akhir jejak
Jika {position} adalah angka titik mengambang antara 0 dan 100, angka tersebut akan bergerak ke sekitar persentase tersebut dalam lintasan. Contohnya:
- !tt 0.00 - Perjalanan waktu ke awal jejak
- !tt 50.1 - Perjalanan waktu ke lebih dari setengah jalan melalui jejak
- !tt 99.9 - Perjalanan waktu ke hampir akhir jejak
Jika {position} adalah #:#, di mana # adalah angka heksadesimal, ia akan menuju ke posisi tersebut. Jika angka setelah : dihilangkan, angka tersebut default ke nol.
- !tt 1A0: - Perjalanan waktu menuju ke posisi 1A0:0
- !tt 1A0:0 - Perjalanan waktu ke posisi 1A0:0
- !tt 1A0:12F - Perjalanan waktu ke posisi 1A0:12F
Nota
Jejak menggunakan posisi instruksi dua bagian yang mereferensikan referensi posisi tertentu dalam jejak, misalnya 12:0. atau 15:7. Dua elemen tersebut adalah angka heksadesimal yang didefinisikan seperti yang dijelaskan di sini.
xx:yy
xx- elemen pertama adalah nomor urutan, yang sesuai dengan peristiwa urutan.
yy - elemen kedua adalah jumlah langkah, yang sesuai kira-kira dengan jumlah instruksi sejak peristiwa urutan.
!tt putuskan perintah
Kesalahan saat pendaftaran
!tt br[-] <register> [<value>]
Perintah ini akan menavigasi ke posisi sebelumnya/berikutnya di mana daftar yang ditentukan mengubah nilai (atau, jika <value> ditentukan, menjadi nilai yang ditentukan) pada utas saat ini.
Contoh:
!tt br rbx 0x12345678 – temukan posisi berikutnya pada utas saat ini yang mengatur rbx ke 0x12345678.
!tt br- ebx – temukan posisi sebelumnya pada utas saat ini yang mengatur rbx ke nilainya saat ini.
0:000> !tt br- ebx
Setting position: 2C8:0
(3b24.2d98): Break instruction exception - code 80000003 (first/second chance not available)
Time Travel Position: 2C8:0
ntdll!LdrInitializeThunk:
00007ff9`999e3dd0 4053 push rbx
- Perintah register watchpoint mendukung semua arsitektur Windows yang didukung, seperti x64 dan ARM64.
- Titik pengawasan register terbatas pada register tujuan umum (dan register XMM).
- Titik pengawasan register diimplementasikan dengan algoritma yang lambat dibandingkan dengan kecepatan pemutaran ulang jejak normal. Pencarian dapat dibatalkan menggunakan Ctrl+C.
Putuskan akses
!tt ba[-] <rwe> <address> <size> [<address> <size> …]
Perintah ini akan menavigasi ke posisi sebelumnya/berikutnya di mana salah satu rentang memori yang ditentukan diakses dengan cara yang ditentukan: "R" adalah untuk pembacaan memori, "W" adalah untuk penulisan memori dan "E" adalah untuk eksekusi. Lebih dari satu dapat ditentukan pada saat yang sama, yaitu "RW". Ini mirip dengan perintah debugger ba (Break on Access).
Contoh: !tt ba- rw 0x12345678 0x4000 – temukan posisi sebelumnya yang membaca dari rentang memori. (0x12345678 – 0x12345678 + 0x4000).
!tt ba e 0x7fffe0001234 0x30000 – temukan posisi berikutnya yang dijalankan dari rentang yang ditentukan. Anggap bahwa alamat dan rentang mewakili rentang ntdll.dll. Perintah ini akan menemukan posisi berikutnya di mana ntdll.dll dimasukkan.
- Alamat/ukuran harus disediakan sebagai angka. Simbol tidak didukung.
Berhenti pada modul
Gunakan Hentian pada metode navigasi modul untuk bergerak maju atau mundur di tingkat modul.
!tt bm[-] [<module> ...]
Perintah ini mundur/melompat ke lokasi sebelumnya/berikutnya yang menjalankan salah satu modul yang ditentukan.
Jika tidak ada modul yang ditentukan, modul akan melakukan perjalanan ke titik eksekusi sebelumnya/berikutnya di luar modul yang sedang dijalankan.
Saat menggunakan perintah ini untuk berpindah dalam pelacakan, pencarian mundur jauh lebih lambat daripada mencari maju.
Contoh kasus penggunaan
Berikut adalah dua contoh kasus penggunaan.
Gunakan kasus 1 - Maju atau mundur hingga Anda berada dalam modul yang berbeda pada utas saat ini. Dalam hal ini, TTD bergerak maju dari dwmcore ke ucrtbase dan kemudian mundur ke ntdll.
Contoh pelacakan dimulai pada pengecualian dalam modul dwmcore.
Setting position: 1C46AE:0
(a54.c98): Break instruction exception - code 80000003 (first/second chance not available)
Time Travel Position: 1C46AE:0
dwmcore!wil_atomic_uint32_compare_exchange_relaxed+0xc [inlined in dwmcore!wil_details_FeatureReporting_RecordUsageInCache+0x124]:
00007ffa`441e16a0 f0450fb102 lock cmpxchg dword ptr [r10],r8d ds:00007ffa`444b0450=00000003
Jalankan perintah !tt bm command. Karena tidak ada modul yang ditentukan, lakukan perjalanan ke titik eksekusi berikutnya di luar modul yang sedang dijalankan - ucrtbase.
0:001> !tt bm
Replaying - Currently at 1D1BEE:0 ( 2.95%)
Setting position: 1C46AF:61
(a54.c98): Break instruction exception - code 80000003 (first/second chance not available)
Time Travel Position: 1C46AF:61
ucrtbase!_finite:
00007ffa`4ac3c080 48b9ffffffffffffff7f mov rcx,7FFFFFFFFFFFFFFFh
Satu langkah dari lokasi tersebut, TTD menemukan batas modul dengan benar.
0:001> t-
Time Travel Position: 1C46AF:60
dwmcore!CBaseExpression::IsExpressionValueValid+0x50:
00007ffa`44124b40 48ff15f9db2700 call qword ptr [dwmcore!_imp__finite (00007ffa`443a2740)] ds:00007ffa`443a2740={ucrtbase!_finite (00007ffa`4ac3c080)}
(a54.c98): Break instruction exception - code 80000003 (first/second chance not available)
Time Travel Position: 1C46AE:0
dwmcore!wil_atomic_uint32_compare_exchange_relaxed+0xc [inlined in dwmcore!wil_details_FeatureReporting_RecordUsageInCache+0x124]:
00007ffa`441e16a0 f0450fb102 lock cmpxchg dword ptr [r10],r8d ds:00007ffa`444b0450=00000003
Telusuri ke belakang untuk batas modul berikutnya.
0:001> !tt bm-
Setting position: 1C46AD:2B1
(a54.c98): Break instruction exception - code 80000003 (first/second chance not available)
Time Travel Position: 1C46AD:2B1
ntdll!LdrpDispatchUserCallTarget+0x3b:
00007ffa`4d27f24b 48ffe0 jmp rax {dwmcore!CKeyframeAnimation::CalculateValueWorker (00007ffa`441264e0)}
Kemudian teruskan dari batas modul, ke modul berikutnya.
0:001> t
Time Travel Position: 1C46AD:2B2
dwmcore!CKeyframeAnimation::CalculateValueWorker:
00007ffa`441264e0 48895c2408 mov qword ptr [rsp+8],rbx ss:0000004e`5151f4d0=0000000000000000
Gunakan kasus 2 - Maju hingga modul dimasukkan. Dalam contoh ini, ntdll.
0:001> !tt bm ntdll
Replaying - Currently at 1CBF15:0 ( 1.66%)
Setting position: 1C46B0:97
(a54.c98): Break instruction exception - code 80000003 (first/second chance not available)
Time Travel Position: 1C46B0:97
ntdll!LdrpDispatchUserCallTarget:
00007ffa`4d27f210 4c8b1db1c11000 mov r11,qword ptr [ntdll!LdrSystemDllInitBlock+0xb8 (00007ffa`4d38b3c8)] ds:00007ffa`4d38b3c8=00007df503990000
Anda dapat menggunakan !tt bm- <module> untuk mencari mundur.
Model Data - NextModuleAccess dan PrevModuleAccess
Gunakan perintah dx (Ekspresi Model Objek Debugger Tampilan) dan objek model data NextModuleAccess dan PrevModuleAccess, untuk mengakses fungsionalitas yang sama, yang tersedia dalam perintah !tt.
Teruskan ke batas akses modul berikutnya.
0:001> dx @$curprocess.TTD.NextModuleAccess()
Replaying - Currently at 1D1BEE:0 ( 2.95%)
@$curprocess.TTD.NextModuleAccess() : [UTID 3] Execute [1C46AE:0] -> [1C46AF:61] ucrtbase 0x7ffa4ac3c080
Position : 1C46AF:61
OriginalPosition : 1C46AE:0
UniqueThreadId : 0x3
AccessType : Execute
Address : 0x7ffa4ac3c080
ModuleName : ucrtbase
Bergerak mundur ke batas akses sebelumnya.
0:001> dx @$curprocess.TTD.PrevModuleAccess()
@$curprocess.TTD.PrevModuleAccess() : [UTID 3] Execute [1C46AE:0] -> [1C46AD:2B1] ntdll 0x7ffa4d27f24b
Position : 1C46AD:2B1
OriginalPosition : 1C46AE:0
UniqueThreadId : 0x3
AccessType : Execute
Address : 0x7ffa4d27f24b
ModuleName : ntdll
Teruskan ke batas akses modul ntdll berikutnya.
0:001> dx @$curprocess.TTD.NextModuleAccess("ntdll")
Replaying - Currently at 1CBF15:0 ( 1.66%)
@$curprocess.TTD.NextModuleAccess("ntdll") : [UTID 3] Execute [1C46AE:0] -> [1C46B0:97] ntdll 0x7ffa4d27f210
Position : 1C46B0:97
OriginalPosition : 1C46AE:0
UniqueThreadId : 0x3
AccessType : Execute
Address : 0x7ffa4d27f210
ModuleName : ntdll
Menggunakan objek model debugger untuk titik henti TTD
Fungsi penghentian akses memori dapat diakses melalui perintah dx (Ekspresi Model Objek Debugger Tampilan), jendela model data debugger, JavaScript, dan C++. Untuk informasi umum tentang bekerja dengan kueri LINQ dan objek debugger, lihat Menggunakan LINQ Dengan objek debugger.
TTD. PrevRegisterWrite
dx @$curthread.TTD.PrevRegisterWrite("<reg>" [, <value>])
Metode ini mencari posisi sebelumnya di mana register yang ditentukan mengubah nilai (atau menjadi nilai yang ditentukan jika <value> ditentukan) pada utas saat ini. Ini dianalogikan dengan perintah di !tt br- atas, kecuali tidak secara otomatis menavigasi ke posisi. Sebagai gantinya, ia mengembalikan informasi seperti berikut ini:
0:000> dx @$curthread.TTD.PrevRegisterWrite("rbx")
@$curthread.TTD.PrevRegisterWrite("rbx") : [UTID 2] rbx [2C8:0] 0x0 -> [2C8:0] 0x0
Register : rbx
Position : 2C8:0 [Time Travel]
Value : 0x0
OriginalPosition : 2C8:0 [Time Travel]
OriginalValue : 0x0
UniqueThreadId : 0x2
Demikian pula, Anda dapat menggunakan @$curthread. TTD. NextRegisterWrite(...) untuk mencari perubahan register berikutnya.
0:000> dx @$curthread.TTD.NextRegisterWrite("rbx")
@$curthread.TTD.NextRegisterWrite("rbx") : [UTID 2] rbx [2C8:1] 0x0 -> [2C8:2] 0x963127f5a0
Register : rbx
Position : 2C8:2 [Time Travel]
Value : 0x963127f5a0
OriginalPosition : 2C8:1 [Time Travel]
OriginalValue : 0x0
UniqueThreadId : 0x2
Gunakan tautan [Perjalanan Waktu] dalam output, untuk berpindah ke postion tersebut di jejak.
0:000> dx -s @$create("Debugger.Models.TTD.Position", 712, 0).SeekTo()
(3b24.2d98): Break instruction exception - code 80000003 (first/second chance not available)
Time Travel Position: 2C8:0
TTD.PrevMemoryAccess
dx @$curprocess.TTD.PrevMemoryAccess("<rwe>", <address>, <size> [, <address>, <size> …])
Metode ini mencari posisi sebelumnya di mana salah satu rentang memori yang ditentukan diakses dengan cara yang ditentukan. Ini dianalogikan dengan perintah !tt ba- di atas, kecuali tidak secara otomatis menavigasi ke posisi. Sebagai gantinya, ia mengembalikan informasi seperti berikut ini:
@$curprocess.TTD.PrevMemoryAccess("w", 0x01a16a939820, 0x10) : [UTID 3] Write 0x1a16a939828 4 bytes [1C46AE:0] -> [1C4575:0]
Position : 1C4575:0
OriginalPosition : 1C46AE:0
UniqueThreadId : 0x3
Address : 0x1a16a939828
Size : 0x4
AccessType : Write
Demikian pula, Anda dapat menggunakan @$curprocess.TTD.NextMemoryAccess(…) untuk mencari akses memori berikutnya.
0:000> dx @$curprocess. TTD. NextMemoryAccess("r", 0x00007ff9`95420000, 0xFF)
@$curprocess.TTD.NextMemoryAccess("r", 0x00007ff9`95420000, 0xFF) : [UTID 2] Read 0x7ff995420000 2 bytes [2C8:0] -> [66C:10A2]
Position : 66C:10A2 [Time Travel]
OriginalPosition : 2C8:0 [Time Travel]
UniqueThreadId : 0x2
Address : 0x7ff995420000
Size : 0x2
AccessType : Read
!tt DLL
ttdext.dll
Informasi Tambahan
Ekstensi ini hanya berfungsi dengan jejak perjalanan waktu. Untuk informasi lebih lanjut tentang time travel, lihat Time Travel Debugging - Gambaran Umum.