Aracılığıyla paylaş


Zaman Yolculuğu Hata Ayıklama nesnelerine giriş

"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