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
"
Bu bölümde, zaman yolculuğu izlemelerini sorgulamak için veri modelinin nasıl kullanılacağı açıklanmaktadır. Bu, zaman yolculuğu izlemesinde yakalanan kodla ilgili bu gibi soruları yanıtlamak için yararlı bir araç olabilir.
- İzlemede hangi istisnalar var?
- Belirli bir kod modülü izleme sırasında hangi noktada yüklendi?
- İzlemede iş parçacıkları ne zaman oluşturuldu/sonlandırıldı?
- İzleme kaydındaki en uzun çalışan iş parçaları nelerdir?
Oturum ve İşlem veri modeli nesnelerine veri ekleyen TTD uzantıları vardır. TTD veri modeli nesnelerine dx (Görüntü Hata Ayıklayıcısı Nesne Modeli İfadesi) komutu, WinDbg'nin model pencereleri, JavaScript ve C++ aracılığıyla erişilebilir. Zaman yolculuğu izlemesi üzerinde hata ayıklama sırasında TTD uzantıları otomatik olarak yüklenir.
nesneleri işleme
process nesnelerine eklenen birincil nesneler, herhangi bir process nesnesinin TTD ad alanında bulunabilir. Örneğin, @$curprocess.TTD.
0:000> dx @$curprocess.TTD
@$curprocess.TTD
Index
Threads
Events
DebugOutput
Lifetime : [2C8:0, 16EC:98A]
DefaultMemoryPolicy : InFragmentAggressive
SetPosition [Sets the debugger to point to the given position on this process.]
GatherMemoryUse [0]
RecordClients
PrevMemoryAccess [(accessMask, address, size [, address, size, ...]) - Find the previous matching memory access before current position.]
NextMemoryAccess [(accessMask, address, size [, address, size, ...]) - Find the next matching memory access after current position.]
Recorder
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.
Özellikler
| Nesne | Açıklama |
|---|---|
| Yaşam süresi | İzlemenin tamamının ömrünü açıklayan bir TTD aralığı nesnesi . |
| Konular | İzlemenin ömrü boyunca her iş parçacığı için bir tane olmak üzere bir TTD iş parçacığı nesneleri koleksiyonu içerir. |
| Etkinlikler | İzlemedeki her olay için bir TTD olay nesnesi koleksiyonu içerir. |
Yöntemler
| Yöntem | Açıklama |
|---|---|
| SetPosition() | Giriş olarak 0 ile 100 arasında bir tamsayı veya N:N formatında bir dizeyi alır ve belirtilen konuma izlemeyi atlar. Daha fazla bilgi için bkz. !tt . |
Oturum Nesneleri
Session nesnelerine eklenen birincil nesneler, herhangi bir Session nesnesinden hareketle TTD ad alanında bulunabilir. Örneğin, @$cursession.TTD.
0:000> dx @$cursession.TTD
@$cursession.TTD
Calls [Returns call information from the trace for the specified set of methods: TTD.Calls("module!method1", "module!method2", ...) For example: dx @$cursession.TTD.Calls("user32!SendMessageA")]
Memory [Returns memory access information for specified address range: TTD.Memory(startAddress, endAddress [, "rwec"])]
MemoryForPositionRange [Returns memory access information for specified address range and position range: TTD.MemoryForPositionRange(startAddress, endAddress [, "rwec"], minPosition, maxPosition)]
PinObjectPosition [Pins an object to the given time position: TTD.PinObjectPosition(obj, pos)]
AsyncQueryEnabled : false
RichQueryTypesEnabled : true
DefaultParameterCount : 0x4
Data : Normalized data sources based on the contents of the time travel trace
Utility : Methods that can be useful when analyzing time travel traces
Analyzers : Methods that perform code analysis on the time travel trace
Bookmarks : Bookmark collection
Checkers : Checkers (scripts for detection of common issues recorded in a time travel trace)
Uyarı
Uzantının iç işlevleri için kullanılan TTDAnalyze tarafından eklenen bazı nesneler ve yöntemler vardır. Tüm ad alanları belgelenmez ve geçerli ad alanları zaman içinde gelişir.
Yöntemler
| Yöntem | Açıklama |
|---|---|
| Data.Heap() | İzleme sırasında ayrılan yığın nesneleri koleksiyonu. Bunun hesaplamayı çalıştıran bir işlev olduğunu, bu nedenle çalıştırılmasının biraz zaman aldığını unutmayın. |
| Çağrılar() | Giriş dizesiyle eşleşen çağrı nesnelerinin bir koleksiyonunu döndürür. Giriş dizesi joker karakter içerebilir. Bunun hesaplamayı çalıştıran bir işlev olduğunu, bu nedenle çalıştırılmasının biraz zaman aldığını unutmayın. |
| Memory() | Bu, beginAddress, endAddress ve dataAccessMask parametrelerini alan ve bir bellek nesneleri koleksiyonu döndüren bir yöntemdir. Bunun hesaplamayı çalıştıran bir işlev olduğunu, bu nedenle çalıştırılmasının biraz zaman aldığını unutmayın. |
Sorgu çıkışını sıralama
Sorgudan döndürülen satırları bir veya daha fazla sütuna göre sıralamak için OrderBy() yöntemini kullanın. Bu örnek, TimeStart'a göre artan düzende sıralanır.
0:000> dx -r2 @$cursession.TTD.Calls("kernelbase!GetLastError").OrderBy(c => c.TimeStart)
@$cursession.TTD.Calls("kernelbase!GetLastError").OrderBy(c => c.TimeStart)
[0x0]
EventType : 0x0
ThreadId : 0x2d98
UniqueThreadId : 0x2
TimeStart : 718:7D7 [Time Travel]
TimeEnd : 718:7DA [Time Travel]
Function : KERNELBASE!GetLastError
FunctionAddress : 0x7ff996cf20f0
ReturnAddress : 0x7ff99855ac5a
ReturnValue : 0x0 [Type: unsigned long]
Parameters
SystemTimeStart : Friday, January 12, 2024 21:18:40.862
SystemTimeEnd : Friday, January 12, 2024 21:18:40.862
[0x1]
EventType : 0x0
ThreadId : 0x2d98
UniqueThreadId : 0x2
TimeStart : 72D:1B3 [Time Travel]
TimeEnd : 72D:1B6 [Time Travel]
Function : KERNELBASE!GetLastError
FunctionAddress : 0x7ff996cf20f0
ReturnAddress : 0x7ff9961538df
ReturnValue : 0x57 [Type: unsigned long]
Parameters
SystemTimeStart : Friday, January 12, 2024 21:18:40.862
SystemTimeEnd : Friday, January 12, 2024 21:18:40.862
...
Veri modeli nesnelerinin ek derinliğini görüntülemek için -r2 özyineleme düzeyi seçeneği kullanılır. dx komut seçenekleri hakkında daha fazla bilgi için bakınız dx (Hata Ayıklayıcı Nesne Modeli İfadesini Görüntüle).
Bu örnek, TimeStart'a göre azalan düzende sıralanır.
0:000> dx -r2 @$cursession.TTD.Calls("kernelbase!GetLastError").OrderByDescending(c => c.TimeStart)
@$cursession.TTD.Calls("kernelbase!GetLastError").OrderByDescending(c => c.TimeStart)
[0x1896]
EventType : Call
ThreadId : 0x3a10
UniqueThreadId : 0x2
TimeStart : 464224:34 [Time Travel]
TimeEnd : 464224:37 [Time Travel]
Function : UnknownOrMissingSymbols
FunctionAddress : 0x7561ccc0
ReturnAddress : 0x7594781c
ReturnValue : 0x0
Parameters
[0x18a0]
EventType : Call
ThreadId : 0x3a10
UniqueThreadId : 0x2
TimeStart : 464223:21 [Time Travel]
TimeEnd : 464223:24 [Time Travel]
Function : UnknownOrMissingSymbols
FunctionAddress : 0x7561ccc0
ReturnAddress : 0x7594781c
ReturnValue : 0x0
Parameters
Sorgudaki öğeleri belirtme
Belirli bir öğeyi seçmek için sorguya çeşitli niteleyiciler eklenebilir. Örneğin, sorgu "kernelbase!GetLastError" içeren ilk çağrıyı gösterir.
0:000> dx @$cursession.TTD.Calls("kernelbase!GetLastError").First()
@$cursession.TTD.Calls("kernelbase!GetLastError").First()
EventType : 0x0
ThreadId : 0x2d98
UniqueThreadId : 0x2
TimeStart : 718:7D7 [Time Travel]
TimeEnd : 718:7DA [Time Travel]
Function : KERNELBASE!GetLastError
FunctionAddress : 0x7ff996cf20f0
ReturnAddress : 0x7ff99855ac5a
ReturnValue : 0x0 [Type: unsigned long]
Parameters
SystemTimeStart : Friday, January 12, 2024 21:18:40.862
SystemTimeEnd : Friday, January 12, 2024 21:18:40.862
Sorguda filtreleme
Hangi sütunların görüntüleneceğini seçmek ve sütun görünen adını değiştirmek için Select() yöntemini kullanın.
Bu örnek, ReturnValue değerinin sıfır olmadığı satırları döndürür ve TimeStart ve ReturnValue sütunlarını Time ve Error özel görünen adlarıyla görüntülemeyi seçer.
0:000> dx -r2 @$cursession.TTD.Calls("kernelbase!GetLastError").Where(c => c.ReturnValue != 0).Select(c => new { Time = c.TimeStart, Error = c.ReturnValue })
@$cursession.TTD.Calls("kernelbase!GetLastError").Where(c => c.ReturnValue != 0).Select(c => new { Time = c.TimeStart, Error = c.ReturnValue })
[0x1]
Time : 72D:1B3 [Time Travel]
Error : 0x57 [Type: unsigned long]
[0x2]
Time : 72D:1FC [Time Travel]
Error : 0x2af9 [Type: unsigned long]
[0x3]
Time : 72D:26E [Time Travel]
Error : 0x2af9 [Type: unsigned long]
Gruplama
Yapılandırılmış sonuçları kullanarak analiz gerçekleştirmek üzere sorgu tarafından döndürülen verileri gruplandırmak için GroupBy() yöntemini kullanın. Bu örnek, zaman konumlarını hata numarasına göre gruplandırabilir.
0:000> dx -r2 @$cursession.TTD.Calls("kernelbase!GetLastError").Where(c => c.ReturnValue != 0).Select(c => new { Time = c.TimeStart, Error = c.ReturnValue }).GroupBy(x => x.Error)
@$s = @$cursession.TTD.Calls("kernelbase!GetLastError").Where(c => c.ReturnValue != 0).Select(c => new { Time = c.TimeStart, Error = c.ReturnValue }).GroupBy(x => x.Error)
[0x36b7]
[0x0]
[0x1]
[0x2]
[0x3]
[...]
[0x3f0]
[0x0]
[0x1]
[0x2]
[0x3]
...
Sorgunun sonucunu değişkene atama
Bir sorgunun sonucunu değişkene atamak için bu söz dizimini kullanın dx @$var = <expression>
Bu örnek, myResults'a bir sorgunun sonuçlarını atar
dx -r2 @$myResults = @$cursession.TTD.Calls("kernelbase!GetLastError").Where(c => c.ReturnValue != 0).Select(c => new { Time = c.TimeStart, Error = c.ReturnValue })
-g kılavuz seçeneğini kullanarak yeni oluşturulan değişkeni görüntülemek için dx komutunu kullanın. dx komut seçenekleri hakkında daha fazla bilgi için bkz. dx (Hata Ayıklayıcı Nesne Modeli İfadesini Görüntüle).
0:000> dx -g @$myResults
========================================
= = (+) Time = (+) Error =
========================================
= [0x13] - 3C64A:834 - 0x36b7 =
= [0x1c] - 3B3E7:D6 - 0x3f0 =
= [0x1d] - 3C666:857 - 0x36b7 =
= [0x20] - 3C67E:12D - 0x2 =
= [0x21] - 3C6F1:127 - 0x2 =
= [0x23] - 3A547:D6 - 0x3f0 =
= [0x24] - 3A59B:D0 - 0x3f0 =
Örnekler
Özel durumlar için sorgulama
Bu LINQ sorgusu TTD'yi kullanır. İzlemedeki tüm özel durumları görüntülemek için olay nesnesi.
0:000> dx @$curprocess.TTD.Events.Where(t => t.Type == "Exception").Select(e => e.Exception)
@$curprocess.TTD.Events.Where(t => t.Type == "Exception").Select(e => e.Exception)
[0x0] : Exception 0x000006BA of type Software at PC: 0X777F51D0
[0x1] : Exception 0x000006BA of type Software at PC: 0X777F51D0
[0x2] : Exception 0xE06D7363 of type CPlusPlus at PC: 0X777F51D0
Belirli API çağrıları için sorgulama
TTD kullanın. Belirli API çağrıları için sorguya nesnesi çağırır. Bu örnekte, bir ileti kutusu göstermek için Windows API'si olan user32!MessageBoxW çağrılırken bir hata oluştu. MessageBoxW'a yapılan tüm çağrıları listeler, işlevin başlangıç zamanına göre sıralar ve ardından son çağrıyı seçeriz.
0:000> dx @$cursession.TTD.Calls("user32!MessageBoxW").OrderBy(c => c.TimeStart).Last()
@$cursession.TTD.Calls("user32!MessageBoxW").OrderBy(c => c.TimeStart).Last()
EventType : Call
ThreadId : 0x3a10
UniqueThreadId : 0x2
TimeStart : 458310:539 [Time Travel]
TimeEnd : 45C648:61 [Time Travel]
Function : UnknownOrMissingSymbols
FunctionAddress : 0x750823a0
ReturnAddress : 0x40cb93
ReturnValue : 0x10a7000000000001
Parameters
Belirli bir modülün yük olayını sorgulama
İlk olarak, yüklenen modülleri görüntülemek için lm (Yüklenen Modülleri Listele) komutunu kullanın.
0:000> lm
start end module name
012b0000 012cf000 CDog_Console (deferred)
11570000 1158c000 VCRUNTIME140D (deferred)
11860000 119d1000 ucrtbased (deferred)
119e0000 11b63000 TTDRecordCPU (deferred)
11b70000 11cb1000 TTDWriter (deferred)
73770000 73803000 apphelp (deferred)
73ea0000 74062000 KERNELBASE (deferred)
75900000 759d0000 KERNEL32 (deferred)
77070000 771fe000 ntdll (private pdb symbols)
Ardından ntdll gibi belirli bir modülün hangi konumda yüklendiğini görmek için aşağıdaki dx komutunu kullanın.
dx @$curprocess.TTD.Events.Where(t => t.Type == "ModuleLoaded").Where(t => t.Module.Name.Contains("ntdll.dll"))
@$curprocess.TTD.Events.Where(t => t.Type == "ModuleLoaded").Where(t => t.Module.Name.Contains("ntdll.dll"))
[0x0] : Module Loaded at position: A:0
Bu LINQ sorgusu belirli bir modülün yük olaylarını görüntüler.
0:000> dx @$curprocess.TTD.Events.Where(t => t.Type == "ModuleUnloaded").Where(t => t.Module.Name.Contains("ntdll.dll"))
@$curprocess.TTD.Events.Where(t => t.Type == "ModuleUnloaded").Where(t => t.Module.Name.Contains("ntdll.dll"))
[0x0] : Module Unloaded at position: FFFFFFFFFFFFFFFE:0
FFFFFFFFFFFFFFFFFE:0 adresi takip işleminin sonunu gösterir.
İzlemedeki tüm hata denetimlerini sorgulama
Şu komutu kullanarak izlemedeki hata denetimlerini hata sayılarına göre sıralayabilirsiniz.
0:000> dx -g @$cursession.TTD.Calls("kernelbase!GetLastError").Where( x=> x.ReturnValue != 0).GroupBy(x => x.ReturnValue).Select(x => new { ErrorNumber = x.First().ReturnValue, ErrorCount = x.Count()}).OrderByDescending(p => p.ErrorCount),d
==================================================
= = (+) ErrorNumber = ErrorCount =
==================================================
= [1008] - 1008 - 8668 =
= [14007] - 14007 - 4304 =
= [2] - 2 - 1710 =
= [6] - 6 - 1151 =
= [1400] - 1400 - 385 =
= [87] - 87 - 383 =
İş parçacıklarının oluşturulduğu izlemedeki zaman konumunu sorgulama
İzlemedeki tüm olayları kılavuz biçiminde (-g) görüntülemek için bu dx komutunu kullanın.
0:000> dx -g @$curprocess.TTD.Events
==================================================================================================================================================================================================
= = (+) Type = (+) Position = (+) Module = (+) Thread =
==================================================================================================================================================================================================
= [0x0] : Module Loaded at position: 2:0 - ModuleLoaded - 2:0 - Module C:\Users\USER1\Documents\Visual Studio 2015\Proje... - =
= [0x1] : Module Loaded at position: 3:0 - ModuleLoaded - 3:0 - Module C:\WINDOWS\SYSTEM32\VCRUNTIME140D.dll at address 0... - =
= [0x2] : Module Loaded at position: 4:0 - ModuleLoaded - 4:0 - Module C:\WINDOWS\SYSTEM32\ucrtbased.dll at address 0X118... - =
= [0x3] : Module Loaded at position: 5:0 - ModuleLoaded - 5:0 - Module C:\Users\USER1\AppData\Local\Dbg\UI\Fast.20170907... - =
= [0x4] : Module Loaded at position: 6:0 - ModuleLoaded - 6:0 - Module C:\Users\USER1\AppData\Local\Dbg\UI\Fast.20170907... - =
= [0x5] : Module Loaded at position: 7:0 - ModuleLoaded - 7:0 - Module C:\WINDOWS\SYSTEM32\apphelp.dll at address 0X73770... - =
= [0x6] : Module Loaded at position: 8:0 - ModuleLoaded - 8:0 - Module C:\WINDOWS\System32\KERNELBASE.dll at address 0X73... - =
= [0x7] : Module Loaded at position: 9:0 - ModuleLoaded - 9:0 - Module C:\WINDOWS\System32\KERNEL32.DLL at address 0X7590... - =
= [0x8] : Module Loaded at position: A:0 - ModuleLoaded - A:0 - Module C:\WINDOWS\SYSTEM32\ntdll.dll at address 0X7707000... - =
= [0x9] : Thread created at D:0 - ThreadCreated - D:0 - - UID: 2, TID: 0x4C2C =
= [0xa] : Thread terminated at 64:0 - ThreadTerminated - 64:0 - - UID: 2, TID: 0x4C2C =
= [0xb] : Thread created at 69:0 - ThreadCreated - 69:0 - - UID: 3, TID: 0x4CFC =
= [0xc] : Thread created at 6A:0 - ThreadCreated - 6A:0 - - UID: 4, TID: 0x27B0 =
= [0xd] : Thread terminated at 89:0 - ThreadTerminated - 89:0 - - UID: 4, TID: 0x27B0 =
= [0xe] : Thread terminated at 8A:0 - ThreadTerminated - 8A:0 - - UID: 3, TID: 0x4CFC =
= [0xf] : Module Unloaded at position: FFFFFFFFFFFFFFFE:0 - ModuleUnloaded - FFFFFFFFFFFFFFFE:0 - Module C:\Users\USER1\Documents\Visual Studio 2015\Proje... - =
= [0x10] : Module Unloaded at position: FFFFFFFFFFFFFFFE:0 - ModuleUnloaded - FFFFFFFFFFFFFFFE:0 - Module C:\Users\USER1\AppData\Local\Dbg\UI\Fast.20170907... - =
= [0x11] : Module Unloaded at position: FFFFFFFFFFFFFFFE:0 - ModuleUnloaded - FFFFFFFFFFFFFFFE:0 - Module C:\WINDOWS\SYSTEM32\VCRUNTIME140D.dll at address 0... - =
= [0x12] : Module Unloaded at position: FFFFFFFFFFFFFFFE:0 - ModuleUnloaded - FFFFFFFFFFFFFFFE:0 - Module C:\Users\USER1\AppData\Local\Dbg\UI\Fast.20170907... - =
= [0x13] : Module Unloaded at position: FFFFFFFFFFFFFFFE:0 - ModuleUnloaded - FFFFFFFFFFFFFFFE:0 - Module C:\WINDOWS\SYSTEM32\ucrtbased.dll at address 0X118... - =
= [0x14] : Module Unloaded at position: FFFFFFFFFFFFFFFE:0 - ModuleUnloaded - FFFFFFFFFFFFFFFE:0 - Module C:\WINDOWS\SYSTEM32\apphelp.dll at address 0X73770... - =
= [0x15] : Module Unloaded at position: FFFFFFFFFFFFFFFE:0 - ModuleUnloaded - FFFFFFFFFFFFFFFE:0 - Module C:\WINDOWS\System32\KERNELBASE.dll at address 0X73... - =
= [0x16] : Module Unloaded at position: FFFFFFFFFFFFFFFE:0 - ModuleUnloaded - FFFFFFFFFFFFFFFE:0 - Module C:\WINDOWS\System32\KERNEL32.DLL at address 0X7590... - =
= [0x17] : Module Unloaded at position: FFFFFFFFFFFFFFFE:0 - ModuleUnloaded - FFFFFFFFFFFFFFFE:0 - Module C:\WINDOWS\SYSTEM32\ntdll.dll at address 0X7707000... - =
==================================================================================================================================================================================================
Çıkışı sıralamak için + işareti olan sütunlardan herhangi birini seçin.
Bu LINQ sorgusunu, iş parçacıklarının oluşturulduğu izdeki zaman konumunu kılavuz biçiminde görüntülemek için kullanın (Tür == "ThreadCreated").
dx -g @$curprocess.TTD.Events.Where(t => t.Type == "ThreadCreated").Select(t => t.Thread)
===========================================================================================================
= = (+) UniqueId = (+) Id = (+) Lifetime = (+) ActiveTime =
===========================================================================================================
= [0x0] : UID: 2, TID: 0x4C2C - 0x2 - 0x4c2c - [0:0, FFFFFFFFFFFFFFFE:0] - [D:0, 64:0] =
= [0x1] : UID: 3, TID: 0x4CFC - 0x3 - 0x4cfc - [0:0, 8A:0] - [69:0, 8A:0] =
= [0x2] : UID: 4, TID: 0x27B0 - 0x4 - 0x27b0 - [0:0, 89:0] - [6A:0, 89:0] =
===========================================================================================================
İzleme kaydında iş parçacıklarının sonlandırıldığı zaman konumlarını kılavuz formatında görüntülemek için bu LINQ sorgusunu kullanın (Tür == "İş Parçacığı Sonlandırıldı").
0:000> dx -g @$curprocess.TTD.Events.Where(t => t.Type == "ThreadTerminated").Select(t => t.Thread)
===========================================================================================================
= = (+) UniqueId = (+) Id = (+) Lifetime = (+) ActiveTime =
===========================================================================================================
= [0x0] : UID: 2, TID: 0x4C2C - 0x2 - 0x4c2c - [0:0, FFFFFFFFFFFFFFFE:0] - [D:0, 64:0] =
= [0x1] : UID: 4, TID: 0x27B0 - 0x4 - 0x27b0 - [0:0, 89:0] - [6A:0, 89:0] =
= [0x2] : UID: 3, TID: 0x4CFC - 0x3 - 0x4cfc - [0:0, 8A:0] - [69:0, 8A:0] =
===========================================================================================================
En uzun çalışan iş parçacıklarını belirlemek için çıktıyı sıralamak
Bu LINQ sorgusunu, izleme sırasında yaklaşık olarak en uzun süre çalışan iş parçacıklarını, bir kılavuz biçiminde görüntülemek için kullanın.
0:000> dx -g @$curprocess.TTD.Events.Where(e => e.Type == "ThreadTerminated").Select(e => new { Thread = e.Thread, ActiveTimeLength = e.Thread.ActiveTime.MaxPosition.Sequence - e.Thread.ActiveTime.MinPosition.Sequence }).OrderByDescending(t => t.ActiveTimeLength)
=========================================================
= = (+) Thread = ActiveTimeLength =
=========================================================
= [0x0] - UID: 2, TID: 0x1750 - 0x364030 =
= [0x1] - UID: 3, TID: 0x420C - 0x360fd4 =
= [0x2] - UID: 7, TID: 0x352C - 0x35da46 =
= [0x3] - UID: 9, TID: 0x39F4 - 0x34a5b5 =
= [0x4] - UID: 11, TID: 0x4288 - 0x326199 =
= [0x5] - UID: 13, TID: 0x21C8 - 0x2fa8d8 =
= [0x6] - UID: 14, TID: 0x2188 - 0x2a03e3 =
= [0x7] - UID: 15, TID: 0x40E8 - 0x29e7d0 =
= [0x8] - UID: 16, TID: 0x124 - 0x299677 =
= [0x9] - UID: 4, TID: 0x2D74 - 0x250f43 =
= [0xa] - UID: 5, TID: 0x2DC8 - 0x24f921 =
= [0xb] - UID: 6, TID: 0x3B1C - 0x24ec8e =
= [0xc] - UID: 10, TID: 0x3808 - 0xf916f =
= [0xd] - UID: 12, TID: 0x26B8 - 0x1ed3a =
= [0xe] - UID: 17, TID: 0x37D8 - 0xc65 =
= [0xf] - UID: 8, TID: 0x45F8 - 0x1a2 =
=========================================================
Bellek aralığına okuma erişimlerini sorgulama
TTD.Memory nesnesini kullanarak bir bellek aralığına yapılan okuma erişimlerini sorgulayın.
İş Parçacığı Ortam Bloğu (TEB), GetLastError() tarafından döndürülen sonuç da dahil olmak üzere bir iş parçacığının durumuyla ilgili tüm bilgileri içeren bir yapıdır. Geçerli iş parçacığı için dx @$teb komutunu çalıştırarak bu veri yapısını sorgulayabilirsiniz. TEB'in üyelerinden biri, boyutu 4 bayt olan lastErrorValue değişkenidir. Bu söz dizimini kullanarak TEB'deki LastErrorValue üyesine başvurabiliriz.
dx &@$teb->LastErrorValue.
Örnek sorgu, bellekte bu aralıkta yapılan her okuma işleminin nasıl bulunduğunu, bir iletişim kutusu oluşturulmadan önce gerçekleşen tüm okumaları seçmeyi ve ardından son okuma işlemini bulmak için sonucu sıralamayı gösterir.
0:000> dx @$cursession.TTD.Memory(&@$teb->LastErrorValue, &@$teb->LastErrorValue + 0x4, "r")
@$cursession.TTD.Memory(&@$teb->LastErrorValue, &@$teb->LastErrorValue + 0x4, "r")
[0x0]
[0x1]
[0x2]
[0x3]
İzlememizde bir "iletişim kutusu" olayı gerçekleştiyse, bellekte bu aralıkta yapılan her okuma işlemini bulmak için bir sorgu çalıştırabiliriz, iletişim kutusu oluşturulmadan önce gerçekleşen tüm okumaları seçin ve son okuma işlemini bulmak için sonucu sıralayın. Ardından, sonuçta elde edilen zaman konumunda SeekTo() çağrısı yaparak bu noktaya zaman yolculuğu yapın.
:000> dx @$cursession.TTD.Memory(&@$teb->LastErrorValue, &@$teb->LastErrorValue + 0x4, "r").Where(m => m.TimeStart < @$dialog).OrderBy(m => m.TimeStart).Last().TimeEnd.SeekTo()
Setting position: 458300:37
ModLoad: 6cee0000 6cf5b000 C:\WINDOWS\system32\uxtheme.dll
ModLoad: 75250000 752e6000 C:\WINDOWS\System32\OLEAUT32.dll
ModLoad: 76320000 7645d000 C:\WINDOWS\System32\MSCTF.dll
ModLoad: 76cc0000 76cce000 C:\WINDOWS\System32\MSASN1.dll
GitHub TTD Sorgu Laboratuvarı
C++ kodunda hata ayıklamayı, Zaman Yolculuğu Hata Ayıklama kaydı ve sorgular kullanarak, sorunlu kodun yürütülmesi hakkında bilgi bulmak için nasıl yapacağınızı öğrenmek üzere öğreticiye bakın: WinDbg-Samples - Zaman Yolculuğu Hata Ayıklama ve Sorgular.
Laboratuvarda kullanılan tüm kodlara şu şekilde ulaşabilirsiniz: https://github.com/Microsoft/WinDbg-Samples/tree/master/TTDQueries/app-sample.
TTD Sorgularının Sorunlarını Giderme
İşlev adları olarak "UnknownOrMissingSymbols"
Veri modeli uzantısının işlev adları, parametre değerleri vb. sağlamak için tam simge bilgilerine ihtiyacı vardır. Tam simge bilgileri kullanılamadığında hata ayıklayıcı işlev adı olarak "UnknownOrMissingSymbols" kullanır.
- Özel simgeleriniz varsa işlev adını ve parametrelerin doğru listesini alırsınız.
- Ortak simgeleriniz varsa işlev adını ve varsayılan parametre kümesini alırsınız: dört imzasız 64 bit int.
- Sorguladığınız modül için simge bilginiz yoksa, ad olarak "UnknownOrMissingSymbols" kullanılır.
Aramalar için TTD Sorguları
Bir sorgunun bir DLL çağrısı için hiçbir şey döndürmemesinin birkaç nedeni olabilir.
- Çağrının söz dizimi tam olarak doğru değil.
x (Simgeleri İncele)
x <call>kullanarak çağrı söz dizimini doğrulamayı deneyin. x tarafından döndürülen modül adı büyük harfse, bunu kullanın. - DLL henüz yüklenmedi ve izlemenin ilerleyen bölümlerinde yüklenir. Bu sorunu aşmak için, DLL yüklendikten sonra zaman içinde belirli bir noktaya gidin ve sorguyu yeniden yapın.
- Sorgu motorunun izleyemediği çağrı satır içi yapılır.
- Sorgu düzeni çok fazla işlev döndüren joker karakterler kullanır. Eşleşen işlevlerin sayısının yeterince az olması için sorgu desenini daha belirgin hale getirmeye çalışın.
Ayrıca Bkz.
Hata ayıklayıcı nesnelerle LINQ kullanmak
dx (Display Debugger Object Model İfadesi)
Zaman Yolculuğu Hata Ayıklama - Genel Bakış
Zaman Yolculuğu ile Hata Ayıklama - JavaScript Otomasyonu