Bagikan melalui


!tt (perjalanan waktu)

Logo debug penjelajah waktu yang menampilkan jam.

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.

Lihat Juga

Debugging Perjalanan Waktu - Gambaran Umum