Aracılığıyla paylaş


!tt (zaman yolculuğu)

"Zaman yolculuğu hata ayıklama logosu, bir saat içerir ."

Zaman içinde ileri ve geri gitmenizi sağlayan !tt (zaman yolculuğu) hata ayıklayıcısı uzantısı.

!tt gezinti komutları

İzdeki belirli bir konuma seyahat ederek zaman içinde ileri veya geri gitmek için !tt uzantısını kullanın.

!tt [position]

Parametreler

pozisyon

Bu zaman noktasına gitmek için aşağıdaki biçimlerden herhangi birinde bir zaman noktası sağlayın.

  • {position}, 0 ile 100 arasında bir ondalık sayıysa, iz boyunca yaklaşık olarak bu yüzdeye kadar ilerler. Örneğin:

    • !tt 0 - İzin başlangıcına zaman yolculuğu
    • !tt 50 - İz yolunun yarısına zaman yolculuğu
    • !tt 100 - İzlemin sonuna kadar zaman yolculuğu
  • {position}, 0 ile 100 arasında kayan noktalı bir sayıysa, iz boyunca yaklaşık olarak o yüzde kadar ilerler. Örneğin:

    • !tt 0.00 - İzlerin başına zaman yolculuğu
    • !tt 50.1 - Zaman yolculuğu ile izi biraz aşarak yarıya geçin
    • !tt 99.9 - Neredeyse sona yaklaşırken zaman yolculuğu
  • Eğer {position} #:# ise ve burada # bir onaltılık sayıysa, o konuma gider. sonrasındaki sayı atlanırsa, varsayılan olarak sıfır olur.

    • !tt 1A0: - Pozisyon 1A0:0'a zaman yolculuğu
    • !tt 1A0:0 - 1A0:0 konumuna zaman yolculuğu
    • 1A0:12F konumuna zaman yolculuğu

    Uyarı

    İzlemeler, izlem içindeki belirli bir konum referansına başvuran iki bölümlü bir talimat konumu kullanır, örneğin 12:0. veya 15:7. İki öğe, burada açıklandığı gibi tanımlanan onaltılık sayılardır.

    xx:yy

    xx- ilk öğe, sıralama olayına karşılık gelen sıralama numarasıdır.

    yy - ikinci öğe, sıralama olayından bu yana kabaca yönerge sayısına karşılık gelen bir adım sayısıdır.

!tt break komutları

Kayıtta kesme

!tt br[-] <register> [<value>]

Bu komut, belirtilen yazmacın geçerli iş parçacığında değer değiştirdiği (veya <value> belirtilmişse, belirtilen değere dönüştüğü) önceki/sonraki konuma gidecektir.

Örnekler:

!tt br rbx 0x12345678 – rbx'i 0x12345678 olarak ayarlayan mevcut iş parçacığında sonraki konumu bulun.

!tt br- ebx – rbx'i mevcut değerine ayarlayan geçerli iş parçacığındaki önceki konumu bulun.

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
  • Register watchpoint komutu, x64 ve ARM64 gibi desteklenen tüm Windows mimarilerini destekler.
  • Yazmaç izleme noktası genel amaçlı (ve XMM) yazmaçlarla sınırlıdır.
  • Kayıt izleme noktası, normal izleme hızına kıyasla yavaş bir algoritma ile uygulanır. Arama Ctrl+C kullanılarak iptal edilebilir.

Erişimde kesme

!tt ba[-] <rwe> <address> <size> [<address> <size> …]

Bu komut, belirtilen bellek aralıklarından birine belirtilen şekilde erişildiği önceki/sonraki konuma gider: "R" bellek okuma, "W" bellek yazma ve "E" yürütme içindir. Aynı anda birden fazla belirtilebilir, örneğin "RW". Bu, ba (Access'te Kesme) hata ayıklayıcısı komutuna benzer.

Örnekler: !tt ba- rw 0x12345678 0x4000 – bellek aralığından okunan önceki konumu bulun. (0x12345678 – 0x12345678 + 0x4000). !tt ba e 0x7fffe0001234 0x30000 – belirtilen aralıktan yürütülen sonraki konumu bulun. Adres ve aralığın ntdll.dllaralığını temsil eden bir değer olduğunu farz edin. Komut, ntdll.dll'ın girildiği sonraki konumu bulacaktır.

  • Adresler/boyutlar sayı olarak sağlanmalıdır. Simgeler desteklenmez.

Modülde kesme

Modül gezinti yönteminde Kesme özelliğini kullanarak modül düzeyinde ileri veya geri gitme.

!tt bm[-] [<module> ...]

Bu komut, belirtilen modüllerden birini çalıştıran önceki/sonraki konuma zaman yolculuğu yapar.

Modül belirtilmezse, o anda yürütülen modülün dışındaki önceki/sonraki yürütme noktasına gidecektir.

İzlemede hareket etmek için bu komutu kullanırken geriye doğru arama yapmak, ileriye doğru aramaktan çok daha yavaştır.

Kullanım örnekleri

Aşağıda iki örnek kullanım örneği verilmiştir.

Kullanım örneği 1 - Geçerli iş parçacığında farklı bir modüle gelene kadar ileri veya geri gidin. Bu durumda, TTD ileriye doğru dwmcore modülünden ucrtbase modülüne geçer ve ardından geriye doğru ntdll'ye gider.

İzleme örneği, dwmcore modülündeki bir istisna ile başlar.

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

!tt bm commmand komutunu yürütün. Modül belirtilmediğinden, şu anda yürütülen modülün (ucrtbase) dışında bir sonraki yürütme noktasına seyahat edin.

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

Bu konumdan tek adımla, TTD modül sınırını doğru buldu.

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

Bir sonraki modül sınırını geriye doğru arayın.

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)}

Ardından modül sınırından sonraki modüle ilerleyin.

0:001> t
Time Travel Position: 1C46AD:2B2
dwmcore!CKeyframeAnimation::CalculateValueWorker:
00007ffa`441264e0 48895c2408      mov     qword ptr [rsp+8],rbx ss:0000004e`5151f4d0=0000000000000000
Kullanım örneği 2 - Modül girilene kadar ilerleyin. Bu örnekte, 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

Geriye doğru arama yapmak için kullanabilirsiniz !tt bm- <module> .

Veri Modeli - NextModuleAccess ve PrevModuleAccess

!tt komutunda bulunan aynı işlevselliğe erişmek için dx (Görüntü Hata Ayıklayıcısı Nesne Modeli İfadesi) komutunu ve NextModuleAccess ve PrevModuleAccess veri modeli nesnelerini kullanın.

Sonraki modül erişim sınırına ilerleyin.

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

Önceki bir sonraki erişim sınırına geri doğru hareket edin.

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

Sonraki ntdll modülü erişim sınırına ilerleyin.

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

TTD kesme noktaları için hata ayıklayıcısı model nesnelerini kullanma

Bellek erişimindeki kesme işlevine dx (Görüntü Hata Ayıklayıcısı Nesne Modeli İfadesi) komutu, hata ayıklayıcıları veri modeli pencereleri, JavaScript ve C++ aracılığıyla erişilebilir. LINQ sorguları ve hata ayıklayıcı nesneleriyle çalışma hakkında genel bilgi için bkz. LINQ'yi hata ayıklayıcı nesneleriyle kullanma.

TTD.PrevRegisterWrite

dx @$curthread.TTD.PrevRegisterWrite("<reg>" [, <value>])

Bu yöntem, belirtilen yazmaç tarafından geçerli iş parçacığındaki değerlerin değiştirildiği (veya belirtilirse <value> belirtilen değere dönüştüğü) önceki konumu arar. Yukarıdaki !tt br- komutuna benzer, ancak otomatik olarak konuma gitmez. Bunun yerine, aşağıdaki gibi bilgiler döndürür:

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

Benzer şekilde, @$curthread.TTD.NextRegisterWrite(...) kullanarak sonraki kayıt değişikliğini arayabilirsiniz.

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

Çıkıştaki [Zaman Yolculuğu] bağlantılarını kullanarak izdeki o konuma taşımak için.

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> …])

Bu yöntem, belirtilen bellek aralıklarından birine belirtilen şekilde erişilen önceki konumu arar. Yukarıdaki !tt ba- komutuna benzer, ancak otomatik olarak konuma gitmez. Bunun yerine, aşağıdaki gibi bilgiler döndürür:

@$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

Benzer şekilde, bir sonraki bellek erişimini aramak için de kullanabilirsiniz @$curprocess.TTD.NextMemoryAccess(…) .

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

Ek Bilgiler

Bu uzantı yalnızca zaman yolculuğu izleriyle çalışır. Zaman yolculuğu hakkında daha fazla bilgi için bkz. Zaman Yolculuğu Hata Ayıklama - Genel Bakış.

Ayrıca Bkz.

Zaman Yolculuğu Hata Ayıklama - Genel Bakış