Bevezetés a Time Travel hibakeresési objektumaiba

Time Travel hibakeresési emblémája, amely egy órát tartalmaz.

Ez a szakasz azt ismerteti, hogyan használható az adatmodell az időutazási nyomkövetések lekérdezésére. Ez hasznos eszköz lehet az időutazási nyomkövetésben rögzített kóddal kapcsolatos ilyen kérdések megválaszolásához.

  • Milyen kivételek vannak a nyomkövetésben?
  • A nyomkövetés melyik pontján töltődik be egy adott kódmodul?
  • Mikor lettek létrehozva/megszakítva szálak a nyomkövetésben?
  • Melyek a leghosszabb futó szálak a nyomkövetésben?

Vannak TTD-bővítmények, amelyek adatokat adnak hozzá a munkamenet- és folyamatmodell-objektumokhoz. A TTD-adatmodell-objektumok a dx (Display Debugger Object Model Expression) paranccsal, a WinDbg modellablakával, a JavaScript és a C++ paranccsal érhetők el. A TTD-bővítmények automatikusan betöltődnek egy időutazási nyomkövetés hibakeresésekor.

Objektumok feldolgozása

A folyamatobjektumokhoz hozzáadott elsődleges objektumok a folyamatobjektumok TTD-névterében találhatók. Például: @$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

A LINQ-lekérdezések és hibakereső objektumok használatával kapcsolatos általános információkért tekintse meg a LINQ használata a hibakereső objektumokkal című témakört.

Tulajdonságok

Objektum Leírás
Élettartam A teljes nyomkövetés élettartamát leíró TTD-tartományobjektum .
Szálak TTD-szálobjektumok gyűjteménye, amely a nyomkövetés teljes időtartama alatt minden szálhoz tartozik.
Események Egy gyűjtemény, amely TTD-eseményobjektumokat tartalmaz, minden nyomkövetési eseményhez egyet-egyet.

Módszerek

Metódus Leírás
SetPosition() Bemenetként egy 0 és 100 közötti egész számot vagy N:N formátumú karakterláncot vesz fel, és a nyomkövetés erre a helyre ugrik. További információ: !tt .

Munkamenet-objektumok

A Session objektumokhoz hozzáadott elsődleges objektumok az TTD névtérben találhatók bármely Session objektum esetén. Például: @$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)

Megjegyzés:

A TTDAnalyze néhány objektumot és metódust ad hozzá, amelyeket a bővítmény belső funkcióihoz használnak. Nem minden névtér van dokumentálva, és az aktuális névterek idővel fejlődnek.

Módszerek

Metódus Leírás
Data.Heap() A nyomkövetés alatt lefoglalt halomobjektumok gyűjteménye. Vegye figyelembe, hogy ez a függvény számítást végez, ezért egy ideig tart a futtatás.
Hívások() A bemeneti sztringnek megfelelő hívásobjektumok gyűjteményét adja vissza. A bemeneti sztring tartalmazhat helyettesítő karaktereket. Vegye figyelembe, hogy ez a függvény számítást végez, ezért egy ideig tart a futtatás.
Memória() Ez a metódus a beginAddress, az endAddress és a dataAccessMask paramétereket veszi igénybe, és memóriaobjektum-gyűjteményt ad vissza. Vegye figyelembe, hogy ez a függvény számítást végez, ezért egy ideig tart a futtatás.

Lekérdezés kimenetének rendezése

Az OrderBy() metódussal rendezheti a lekérdezésből visszaadott sorokat egy vagy több oszlop szerint. Ez a példa növekvő sorrendben rendezi a TimeStartot.

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

Az adatmodell-objektumok további mélységének megjelenítéséhez a -r2 rekurziós szint beállítás használható. A dx parancsbeállításairól további információt a dx (Hibakereső objektummodell-kifejezés megjelenítése) című témakörben talál.

Ez a példa csökkenő sorrendben rendezi a TimeStartot.

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    

Elemek megadása egy lekérdezésben

Egy adott elem kiválasztásához számos minősítő hozzáfűzhető a lekérdezéshez. A lekérdezés például megjeleníti az első hívást, ami tartalmazza a "kernelbase!GetLastError".

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

Szűrés lekérdezésben

A Select() metódussal kiválaszthatja, hogy mely oszlopok jelenjenek meg és módosítsák az oszlop megjelenítendő nevét.

Ez a példa olyan sorokat ad vissza, ahol a ReturnValue értéke nem nulla, és a TimeStart és a ReturnValue oszlopot választja ki, amelyeket egyénileg Idő és Hiba néven jelenít meg.

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]

Csoportosítás

A GroupBy() metódussal csoportosíthatja a lekérdezés által visszaadott adatokat, hogy strukturált eredmények használatával végezzen elemzést. Ez a példa hibaszám alapján csoportosítja az időhelyeket.

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

Lekérdezés eredményének hozzárendelése változóhoz

Ez a szintaxis egy lekérdezés eredményének változóhoz való hozzárendeléséhez használható dx @$var = <expression>

Ez a példa egy lekérdezés eredményeit rendeli a myResultshez

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

A dx paranccsal megjelenítheti az újonnan létrehozott változót a -g rács beállítással. A dx parancsbeállításokról további információt a dx (Hibakereső objektummodell kifejezésének megjelenítése) című témakörben talál.

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     =

Példák

Kivételek lekérdezése

Ez a LINQ-lekérdezés a TTD-t használja. Eseményobjektum a nyomkövetésben szereplő összes kivétel megjelenítéséhez.

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

Adott API-hívások lekérdezése

Használja a TTD-t. Adott API-hívások lekérdezéséhez szükséges objektum meghívása. Ebben a példában hiba történt a felhasználó32 hívása során! MessageBoxW, az üzenetmezőt megjelenítő Windows API. Listázzuk a MessageBoxW összes hívását, rendezzük a függvény kezdési időpontjáig, majd kiválasztjuk az utolsó hívást.

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

Lekérdezés egy adott modul betöltési eseményéhez

Először az lm (List Loaded Modules) paranccsal jelenítse meg a betöltött modulokat.

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)

Ezután a következő dx paranccsal láthatja, hogy a nyomkövetésben milyen pozícióba került egy adott modul, például az 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 

Ez a LINQ-lekérdezés egy adott modul betöltési eseményeit jeleníti meg.

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

Az FFFFFFFFFFFFFE:0 címe a nyomkövetés végét jelzi.

Az összes hiba lekérdezése a nyomkövetésben

Ezzel a paranccsal rendezheti az összes hibaellenőrzést a nyomkövetésben hibaszám szerint.

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        =

Lekérdezés a nyomkövetésben lévő idő pozíciójáról a szálak létrehozásakor

Ezzel a dx paranccsal az összes eseményt rácsformátumban (-g) jelenítheti meg a nyomkövetésben.

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

A kimenet rendezéséhez jelölje ki a + jellel rendelkező bármelyik oszlopot.

Ezzel a LINQ-lekérdezésrel rácsformátumban jelenítheti meg a nyomkövetés időpozícióját a szálak létrehozásakor (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]    =
===========================================================================================================

Ezzel a LINQ-lekérdezésrel rácsformátumban jelenítheti meg a nyomkövetés időpozícióit a szálak leállásakor (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]    =
===========================================================================================================

Kimenet rendezése a leghosszabb futó szálak meghatározásához

Ezzel a LINQ-lekérdezésrel rácsformátumban jelenítheti meg a nyomkövetésben a leghosszabban futó szálakat.

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

Olvasási hozzáférések lekérdezése egy memóriatartományhoz

Használja a TTD-t. Memóriaobjektum , amely a memóriatartomány olvasási hozzáféréseinek lekérdezéséhez kér le lekérdezést.

A szálkörnyezeti blokk (TEB) egy struktúra, amely tartalmazza a szál állapotával kapcsolatos összes információt, beleértve a GetLastError() által visszaadott eredményt is. Ezt az adatstruktúrát az aktuális szálhoz tartozó dx @$teb futtatásával kérdezheti le. A TEB egyik tagja egy LastErrorValue változó, 4 bájt méretű. Ezzel a szintaxissal hivatkozhatunk a TEB LastErrorValue tagjára. dx &@$teb->LastErrorValue.

A példa lekérdezés bemutatja, hogyan keresheti meg az adott tartományban végrehajtott összes olvasási műveletet a memóriában, kiválaszthatja a párbeszédpanel létrehozása előtt végrehajtott összes olvasást, majd rendezheti az eredményt az utolsó olvasási művelet megkereséséhez.

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]     

Ha a nyomkövetésben "párbeszédpanel" esemény történt, lekérdezést futtatva megkereshetjük az adott tartományban a memóriában végzett összes olvasási műveletet, jelölje ki az összes olvasást, amely a párbeszédpanel létrehozása előtt történik, majd rendezze az eredményt az utolsó olvasási művelet megkereséséhez. Ezután az adott időpontra való időutazáshoz hívja meg a SeekTo() függvényt az eredményként kapott időpozícióra.


: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

Ha érdekli a C++ kód hibakeresése Time Travel Hibakeresési felvételt és lekérdezéseket használva az információk feltárásához a kérdéses problémás kód végrehajtásáról, tekintse meg a következő oktatóanyagot: WinDbg-Samples – Time Travel Hibakeresés és lekérdezések.

A laborban használt összes kód itt érhető el: https://github.com/Microsoft/WinDbg-Samples/tree/master/TTDQueries/app-sample.

TTD-lekérdezések hibaelhárítása

"UnknownOrMissingSymbols" függvénynevekként

Az adatmodell-bővítménynek teljes szimbóluminformációra van szüksége a függvénynevek, paraméterértékek stb. megadásához. Ha a teljes szimbóluminformáció nem érhető el, a hibakereső a függvény neveként az "UnknownOrMissingSymbols" nevet használja.

  • Ha privát szimbólumokkal rendelkezik, a függvény nevét és a paraméterek megfelelő listáját fogja megkapni.
  • Ha nyilvános szimbólumokkal rendelkezik, megkapja a függvény nevét és egy alapértelmezett paraméterkészletet – négy előjel nélküli 64 bites egészek.
  • Ha nincs szimbóluminformációja a lekérdezett modulhoz, akkor a rendszer az "UnknownOrMissingSymbols" nevet használja.

TTD-lekérdezések hívásokhoz

Több oka is lehet annak, hogy egy lekérdezés nem ad vissza semmit a DLL-be irányuló hívásokhoz.

  • A hívás szintaxisa nem teljesen helyes. Próbálja meg ellenőrizni a hívás szintaxisát az x (Szimbólumok vizsgálata)x <call> használatával. Ha az x által visszaadott modulnév nagybetűs, használja ezt.
  • A DLL még nincs betöltve, és később lesz betöltve a nyomkövetésben. A probléma megkerüléséhez lépjen egy időpontra a DLL betöltése után, és végezze el újra a lekérdezést.
  • A hívás beágyazott, amelyet a lekérdezési motor nem tud nyomon követni.
  • A lekérdezési minta helyettesítő karaktereket használ, amelyek túl sok függvényt ad vissza. Próbálja meg pontosabbá tenni a lekérdezési mintát, hogy a megfeleltethető függvények száma elég kicsi legyen.

Lásd még:

A LINQ használata hibakereső objektumokkal

dx (Display Debugger Object Model Expression)

Time Travel Hibakeresés – Áttekintés

Time Travel Hibakeresés – JavaScript automatizálás