Delen via


Inleiding tot Time Travel Debugging-objecten

tijdreizen-foutopsporingslogo met een klok.

In deze sectie wordt beschreven hoe u het gegevensmodel gebruikt om traceringen voor tijdreizen op te vragen. Dit kan een handig hulpmiddel zijn om vragen zoals deze te beantwoorden over de code die is vastgelegd in een tijdreistracering.

  • Welke uitzonderingen bevinden zich in de trace-log?
  • Op welk moment in de trace werd een specifieke codemodule geladen?
  • Wanneer zijn threads in het tracelog gestart of beëindigd?
  • Wat zijn de langstlopende threads in de trace?

Er zijn TTD-extensies die gegevens toevoegen aan de sessie- en procesgegevensmodelobjecten. De TTD-gegevensmodelobjecten kunnen worden geopend via de dx-opdracht (Display Debugger Object Model Expression), de modelvensters van WinDbg, JavaScript en C++. De TTD-extensies worden automatisch geladen bij het opsporen van fouten in een tijdsreistracering.

Procesobjecten

De primaire objecten die zijn toegevoegd aan procesobjecten , zijn te vinden in de TTD-naamruimte van een procesobject . Bijvoorbeeld: @$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

Zie LINQ gebruiken met de foutopsporingsprogrammaobjecten voor algemene informatie over het werken met LINQ-query's en foutopsporingsprogrammaobjecten.

Eigenschappen

Voorwerp Beschrijving
Levensduur Een TTD-bereikobject dat de levensduur van de gehele trace beschrijft.
Draden Bevat een verzameling TTD-threadobjecten, één voor elke thread gedurende de levensduur van de tracering.
Gebeurtenissen Bevat een verzameling TTD-gebeurtenisobjecten, één voor elke gebeurtenis in de trace.

Methoden

Methode Beschrijving
SetPosition() Neemt een geheel getal tussen 0 en 100 of een string in de vorm N:N als invoer en verplaatst de tracering naar die locatie. Zie !tt voor meer informatie.

Sessieobjecten

De primaire objecten die zijn toegevoegd aan sessieobjecten , zijn te vinden in de TTD-naamruimte van een sessieobject . Bijvoorbeeld: @$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)

Notitie

Er zijn enkele objecten en methoden toegevoegd door TTDAnalyze die worden gebruikt voor interne functies van de extensie. Niet alle naamruimten worden gedocumenteerd en de huidige naamruimten worden na verloop van tijd verder ontwikkeld.

Methoden

Methode Beschrijving
Data.Heap() Een verzameling heap-objecten die zijn toegewezen tijdens de tracering. Houd er rekening mee dat dit een functie is die berekeningen uitvoert, dus het duurt even voordat deze wordt uitgevoerd.
Oproepen() Retourneert een verzameling aanroepobjecten die overeenkomen met de invoertekenreeks. De invoertekenreeks kan jokertekens bevatten. Houd er rekening mee dat dit een functie is die berekeningen uitvoert, dus het duurt even voordat deze wordt uitgevoerd.
Geheugen() Dit is een methode die parameters beginAddress, endAddress en dataAccessMask gebruikt en een verzameling geheugenobjecten retourneert. Houd er rekening mee dat dit een functie is die berekeningen uitvoert, dus het duurt even voordat deze wordt uitgevoerd.

Queryuitvoer sorteren

Gebruik de methode OrderBy() om de rijen te sorteren die door de query worden geretourneerd door een of meer kolommen. In dit voorbeeld wordt er gesorteerd op de parameter TimeStart in oplopende volgorde.

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
...        

Als u meer diepte van de gegevensmodelobjecten wilt weergeven, wordt de optie -r2 recursieniveau gebruikt. Zie dx (Display Debugger Object Model Expression) voor meer informatie over de dx-opdrachtopties.

In dit voorbeeld wordt gesorteerd op TimeStart in aflopende volgorde.

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    

Elementen in een query opgeven

Als u een specifiek element wilt selecteren, kunt u verschillende kwalificaties toevoegen aan de query. De query geeft bijvoorbeeld de eerste aanroep weer die "kernelbase!GetLastError" bevat.

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

Filteren in een query

Gebruik de Select() methode om te kiezen welke kolommen u wilt zien en om de weergavenaam van de kolom te wijzigen.

In dit voorbeeld worden rijen geretourneerd waarbij ReturnValue niet nul is en selecteert om de kolommen TimeStart en ReturnValue weer te geven met aangepaste weergavenamen van Tijd en Fout.

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]

Groepering

Gebruik de methode GroupBy() om gegevens te groeperen die door de query worden geretourneerd om analyse uit te voeren met behulp van gestructureerde resultaten. In dit voorbeeld worden de tijdlocaties gegroepeerd op foutnummer.

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]           
...

Resultaat van een query toewijzen aan een variabele

Gebruik deze syntaxis om het resultaat van een query toe te wijzen aan een variabele dx @$var = <expression>

In dit voorbeeld worden de resultaten van een query toegewezen aan myResults

dx -r2 @$myResults = @$cursession.TTD.Calls("kernelbase!GetLastError").Where(c => c.ReturnValue != 0).Select(c => new { Time = c.TimeStart, Error = c.ReturnValue })

Gebruik de dx-opdracht om de zojuist gemaakte variabele weer te geven met behulp van de optie -g raster. Zie dx (Display Debugger Object Model Expression) voor meer informatie over de dx-opdrachtopties.

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     =

Voorbeelden

Query's uitvoeren op uitzonderingen

Deze LINQ-query maakt gebruik van de TTD. Gebeurtenisobject om alle uitzonderingen in de tracering weer te geven.

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

Query's uitvoeren op specifieke API-aanroepen

Gebruik TTD. Roept object aan om query's uit te voeren op specifieke API-aanroepen. In dit voorbeeld is er een fout opgetreden bij het aanroepen van gebruiker32. MessageBoxW, de Windows-API om een berichtvak weer te geven. We lijsten alle aanroepen naar MessageBoxW op, sorteren deze op de begintijd van de functie en kiezen vervolgens de laatste aanroep.

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

Opvragen van het laadevenement van een specifieke module

Gebruik eerst het commando lm (List Loaded Modules) om de geladen modules weer te geven.

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)

Gebruik vervolgens de volgende dx-opdracht om te zien op welke positie in de tracering een specifieke module is geladen, zoals ntdll.

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 

Deze LINQ-query geeft de laad-gebeurtenis(en) van een bepaalde module weer.

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

Het adres van FFFFFFFFFFFFFFFE:0 geeft het einde van de tracering aan.

Opvragen van alle foutcontroles in de trace-log

Gebruik deze opdracht om te sorteren op basis van alle foutencontroles in de traceeropdracht, gesorteerd op aantal fouten.

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        =

Opvragen van de tijdpositie in de trace wanneer threads zijn aangemaakt

Gebruik deze dx-opdracht om alle gebeurtenissen in de tracering weer te geven in rasterindeling (-g).

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... -                        =
==================================================================================================================================================================================================

Selecteer een van de kolommen met een +-teken om de uitvoer te sorteren.

Gebruik deze LINQ-query om weer te geven in rasterindeling, de tijdspositie in de trace wanneer threads zijn gemaakt (Type == "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]    =
===========================================================================================================

Gebruik deze LINQ-query om weer te geven in rasterindeling, de tijdposities in de trace wanneer threads zijn beëindigd (Type == "ThreadTerminated").

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]    =
===========================================================================================================

Uitvoer sorteren om de langst lopende threads te bepalen

Gebruik deze LINQ-query om de ongeveer langst lopende threads in de trace weer te geven in rasterindeling.

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            =
=========================================================

Het uitvoeren van query's op leestoegang tot een geheugenbereik

Gebruik het TTD.Geheugenobject om te queryen naar leeshandelingen in een geheugenbereik.

Het Thread Environment Block (TEB) is een structuur die alle informatie bevat met betrekking tot de status van een thread, inclusief het resultaat dat wordt geretourneerd door GetLastError(). U kunt een query uitvoeren op deze gegevensstructuur door deze uit te voeren dx @$teb voor de huidige thread. Een van de leden van TEB is een LastErrorValue-variabele, 4 bytes groot. We kunnen verwijzen naar het lid LastErrorValue in de TEB met behulp van deze syntaxis. dx &@$teb->LastErrorValue.

De voorbeeldquery laat zien hoe u alle leesbewerkingen in dat geheugenbereik kunt vinden, de leesbewerkingen selecteert die plaatsvinden voordat een dialoogvenster wordt gemaakt, en vervolgens het resultaat sorteert om de laatste leesbewerking te vinden.

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]     

Als in onze trace een dialoogvenstergebeurtenis heeft plaatsgevonden, kunnen we een query uitvoeren om elke leesbewerking in dat bereik in het geheugen te vinden, selecteert u alle leesbewerkingen die plaatsvinden voordat het dialoogvenster is gemaakt en sorteert u vervolgens het resultaat om de laatste leesbewerking te vinden. Vervolgens gaat u naar dat tijdstip door SeekTo() aan te roepen op de resulterende tijdspositie.


: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 Query Lab

Zie WinDbg-Samples - Time Travel Debugging en Query's voor een zelfstudie over het opsporen van fouten in C++-code met behulp van een opname van Time Travel Debugging. Gebruik query's om informatie te vinden over de uitvoering van de problematische code in kwestie.

Alle code die in het lab wordt gebruikt, is hier beschikbaar: https://github.com/Microsoft/WinDbg-Samples/tree/master/TTDQueries/app-sample.

Problemen met TTD-query's oplossen

"UnknownOrMissingSymbols" wordt gebruikt als functienamen

De gegevensmodelextensie heeft volledige symboolgegevens nodig om functienamen, parameterwaarden, enzovoort op te geven. Als volledige symboolinformatie niet beschikbaar is, gebruikt het foutopsporingsprogramma 'UnknownOrMissingSymbols' als de functienaam.

  • Als u persoonlijke symbolen hebt, krijgt u de functienaam en de juiste lijst met parameters.
  • Als u openbare symbolen hebt, krijgt u de functienaam en een standaardset parameters: vier niet-ondertekende 64-bits ints.
  • Als u geen symboolgegevens hebt voor de module waarop u een query uitvoert, wordt 'UnknownOrMissingSymbols' gebruikt als de naam.

TTD-query's voor aanroepen

Er kunnen verschillende redenen zijn waarom een query niets retourneert voor aanroepen naar een DLL.

  • De syntaxis voor de aanroep is niet helemaal juist. Controleer de aanroepsyntaxis met behulp van de x (Symbolen onderzoeken).x <call> Als de modulenaam die door x wordt geretourneerd, in hoofdletters staat, gebruikt u die.
  • Het DLL-bestand is nog niet geladen en wordt later in de trace geladen. Om dit probleem te omzeilen, gaat u naar een bepaald tijdstip nadat het DLL-bestand is geladen en voert u de query opnieuw uit.
  • De aanroep is inline, waardoor de query-engine deze niet kan bijhouden.
  • Het querypatroon maakt gebruik van jokertekens die te veel functies retourneren. Probeer het querypatroon specifieker te maken, zodat het aantal overeenkomende functies klein genoeg is.

Zie ook

LINQ gebruiken met de foutopsporingsprogrammaobjecten

dx (Display Debugger Object Model Expression)

Time Travel Debugging - Overzicht

Tijdreisfoutopsporing - JavaScript Automation