Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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