Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
"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ış.