タイム トラベル デバッグ オブジェクトの概要

Small time travel logo showing clock.

このセクションでは、データ モデルを使用してタイム トラベル トレースのクエリを実行する方法について説明します。 これは、タイム トラベル トレースでキャプチャされたコードに関する次のような質問に回答するための強力なツールです。

  • トレース内の例外は何ですか?
  • トレースのどのような時点で特定のコード モジュールが読み込まれますか?
  • トレースでスレッドが作成/終了されたのはいつですか?
  • トレースで最も実行時間の長いスレッドは何ですか?

セッション およびプロセス データ モデル オブジェクトにデータを追加する TTD 拡張機能があります。 TTD データ モデル オブジェクトには、 dx (デバッガー オブジェクト モデル式の表示) コマンド、WinDbg プレビューのモデル ウィンドウ、JavaScript、C++ を使用してアクセスできます。 タイム トラベル トレースをデバッグすると、TTD 拡張機能が自動的に読み込まれます。

プロセス オブジェクト

Process オブジェクトに追加されたプライマリ オブジェクトは、任意の Process オブジェクトの TTD 名前空間にあります。 たとえば、「 @$curprocess.TTD 」のように入力します。

:000> dx @$curprocess.TTD
@$curprocess.TTD                
    Threads         
    Events          
    Lifetime         : [26:0, 464232:0]
    SetPosition      [Sets the debugger to point to the given position on this process.]

LINQ クエリとデバッガー オブジェクトの操作に関する一般的な情報については、「 デバッガー オブジェクトでの LINQ の使用」を参照してください。

Properties

Object 説明
有効期間 トレース全体の有効期間を記述する TTD 範囲オブジェクト
Threads トレースの有効期間中のすべてのスレッドに対して 1 つずつ、 TTD スレッド オブジェクトのコレクションが含まれます。
イベント トレース内のすべてのイベントに対して 1 つずつ、 TTD イベント オブジェクトのコレクションが含まれます。

メソッド

メソッド 説明
SetPosition() 入力として 0 ~ 100 の整数または N:N 形式の文字列を受け取り、トレースをその場所にジャンプします。 詳細については、 !tt を参照してください。

セッション オブジェクト

Session オブジェクトに追加されるプライマリ オブジェクトは、任意の Session オブジェクトの TTD 名前空間にあります。 たとえば、「 @$cursession.TTD 」のように入力します。

0:000> dx @$cursession.TTD
@$cursession.TTD                 : [object Object]
    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"])]
    DefaultParameterCount : 0x4
    AsyncQueryEnabled : false
    Resources       
    Data             : Normalized data sources based on the contents of the time travel trace
    Utility          : Methods that can be useful when analyzing time travel traces

Note

TTDAnalyze によって追加された、拡張機能の内部関数に使用されるオブジェクトとメソッドがいくつかあります。 すべての名前空間が文書化されているわけではありません。現在の名前空間は時間の経過と共に進化します。

メソッド

メソッド 説明
Data.Heap() トレース中に割り当てられた ヒープ オブジェクト のコレクション。 これは計算を行う関数であるため、実行に時間がかかることに注意してください。
Calls() 入力文字列に一致する 呼び出しオブジェクト のコレクションを返します。 入力文字列にはワイルドカードを含めることができます。 これは計算を行う関数であるため、実行に時間がかかることに注意してください。
Memory() これは、beginAddress、endAddress、dataAccessMask パラメーターを受け取り、 メモリ オブジェクトのコレクションを返すメソッドです。 これは計算を行う関数であるため、実行に時間がかかることに注意してください。

クエリ出力の並べ替え

OrderBy() メソッドを使用して、クエリから返された行を 1 つ以上の列で並べ替えます。 次の使用例は、TimeStart で昇順に並べ替えます。

0:000> dx -r2 @$cursession.TTD.Calls("kernelbase!GetLastError").OrderBy(c => c.TimeStart)
@$cursession.TTD.Calls("kernelbase!GetLastError").OrderBy(c => c.TimeStart)                
    [0xb]           
        EventType        : Call
        ThreadId         : 0x3a10
        UniqueThreadId   : 0x2
        TimeStart        : 39:2DC [Time Travel]
        TimeEnd          : 39:2DF [Time Travel]
        Function         : UnknownOrMissingSymbols
        FunctionAddress  : 0x7561ccc0
        ReturnAddress    : 0x7593d24c
        ReturnValue      : 0x0
        Parameters      
    [0xe]           
        EventType        : Call
        ThreadId         : 0x3a10
        UniqueThreadId   : 0x2
        TimeStart        : AF:36 [Time Travel]
        TimeEnd          : AF:39 [Time Travel]
        Function         : UnknownOrMissingSymbols
        FunctionAddress  : 0x7561ccc0
        ReturnAddress    : 0x4723ef
        ReturnValue      : 0x0
        Parameters  

データ モデル オブジェクトの追加の深度を表示するには、-r2 再帰レベル オプションが使用されます。 dx コマンド オプションの詳細については、「 dx (Display Debugger Object Model Expression)」を参照してください。

次の使用例は、TimeStart で降順に並べ替えます。

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    

クエリ内の要素の指定

特定の要素を選択するには、さまざまな修飾子をクエリに追加できます。 たとえば、クエリには"kernelbase!GetLastError"。

0:000> dx @$cursession.TTD.Calls("kernelbase!GetLastError").First()
@$cursession.TTD.Calls("kernelbase!GetLastError").First()                
    EventType        : Call
    ThreadId         : 0x3a10
    UniqueThreadId   : 0x2
    TimeStart        : 77A:9 [Time Travel]
    TimeEnd          : 77A:C [Time Travel]
    Function         : UnknownOrMissingSymbols
    FunctionAddress  : 0x7561ccc0
    ReturnAddress    : 0x6cf12406
    ReturnValue      : 0x0
    Parameters    

クエリでのフィルター処理

Select() メソッドを使用して、表示する列を選択し、列名を変更します。

次の使用例は、ReturnValue が 0 ではない行を返し、Time と Error のカスタム表示名を持つ TimeStart 列と ReturnValue 列を表示することを選択します。

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 })                
    [0x13]          
        Time             : 3C64A:834 [Time Travel]
        Error            : 0x36b7
    [0x1c]          
        Time             : 3B3E7:D6 [Time Travel]
        Error            : 0x3f0
    [0x1d]          
        Time             : 3C666:857 [Time Travel]
        Error            : 0x36b7
    [0x20]          
        Time             : 3C67E:12D [Time Travel]

グループ化

GroupBy() メソッドを使用して、構造化された結果を使用して分析を実行するためにクエリによって返されるデータをグループ化します。この例では、時間の場所をエラー番号でグループ化します。

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

クエリの結果を変数に割り当てる

この構文を使用して、クエリの結果を変数に割り当てます dx @$var = <expression>

この例では、クエリの結果を myResults に割り当てます

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

dx コマンドを使用して、-g グリッド オプションを使用して新しく作成された変数を表示します。 dx コマンド オプションの詳細については、「 dx (Display Debugger Object Model Expression)」を参照してください。

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     =

例外のクエリ

この LINQ クエリでは TTD が使用されます。 トレース内のすべての例外を表示するイベント オブジェクト。

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

特定の API 呼び出しのクエリ

TTD を使用します。オブジェクトを呼び出して、特定の API 呼び出しを照会します。 この例では、user32! を呼び出すときにエラーが発生しました。メッセージ ボックスを表示するWindows API である MessageBoxW。 MessageBoxW へのすべての呼び出しを一覧表示し、関数の開始時刻までに並べ替え、最後の呼び出しを選択します。

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

特定のモジュールの読み込みイベントのクエリ

最初に、 lm (List Loaded Modules) コマンドを使用して、読み込まれたモジュールを表示します。

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)

次に、次の dx コマンドを使用して、特定のモジュールが読み込まれたトレース内の位置 (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 

この LINQ クエリは、特定のモジュールの読み込みイベントを表示します。

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

FFFFFFFFFFFFFE:0 のアドレスは、トレースの終了を示します。

トレース内のすべてのエラー チェックのクエリ

トレース内のすべてのエラー チェックをエラー数で並べ替えるには、このコマンドを使用します。

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        =

スレッドが作成されたときのトレース内の時刻位置のクエリ

この dx コマンドを使用して、トレース内のすべてのイベントをグリッド形式 (-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... -                        =
==================================================================================================================================================================================================

+記号が付いた列のいずれかを選択して、出力を並べ替えます。

この LINQ クエリを使用して、スレッドが作成されたときのトレース内の時刻位置をグリッド形式で表示します (型 == "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]    =
===========================================================================================================

この LINQ クエリを使用して、スレッドが終了したときのトレース内の時刻位置をグリッド形式で表示します (型 == "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]    =
===========================================================================================================

出力を並べ替えて実行時間が最も長いスレッドを特定する

この LINQ クエリを使用して、トレース内で最も実行時間の長いおおよそのスレッドであるグリッド形式で表示します。

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

メモリ範囲への読み取りアクセスのクエリ

TTD を使用します 。メモリ 範囲への読み取りアクセスを照会するためにクエリを実行するメモリ オブジェクト。

スレッド環境ブロック (TEB) は、GetLastError() によって返される結果を含む、スレッドの状態に関するすべての情報を含む構造体です。 現在のスレッドに対して実行することで、このデータ構造に対してクエリを実行 dx @$teb できます。 TEB のメンバーの 1 つは、サイズが 4 バイトの LastErrorValue 変数です。 この構文を使用して、TEB の LastErrorValue メンバーを参照できます。 dx &@$teb->LastErrorValue.

このクエリ例では、メモリ内でその範囲で実行されたすべての読み取り操作を検索し、ダイアログが作成される前に発生したすべての読み取りを選択し、結果を並べ替えて最後の読み取り操作を見つける方法を示します。

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]     

トレースで "ダイアログ" イベントが発生した場合は、クエリを実行してその範囲内で実行されたすべての読み取り操作をメモリ内で検索し、ダイアログが作成される前に発生したすべての読み取りを選択し、結果を並べ替えて最後の読み取り操作を見つけることができます。 その後、結果の時刻位置で SeekTo() を呼び出して、その時点まで時間が移動します。


: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

TTD クエリ ラボのGitHub

クエリを使用して Time Travel Debugging レコーディングを使用して C++ コードをデバッグし、問題のあるコードの実行に関する情報を検索する方法のチュートリアルについては、次を参照してください https://github.com/Microsoft/WinDbg-Samples/blob/master/TTDQueries/tutorial-instructions.md

ラボで使用されるすべてのコードは、 https://github.com/Microsoft/WinDbg-Samples/tree/master/TTDQueries/app-sample次のページで入手できます。

TTD クエリのトラブルシューティング

関数名として "UnknownOrMissingSymbols"

データ モデル拡張機能では、関数名、パラメーター値などを指定するために、完全なシンボル情報が必要です。完全なシンボル情報を使用できない場合、デバッガーは関数名として "UnknownOrMissingSymbols" を使用します。

  • プライベート シンボルがある場合は、関数名とパラメーターの正しい一覧を取得します。
  • パブリック シンボルがある場合は、関数名と既定のパラメーター セット (4 つの符号なし 64 ビット ints) が取得されます。
  • クエリを実行するモジュールのシンボル情報がない場合は、名前として "UnknownOrMissingSymbols" が使用されます。

呼び出しの TTD クエリ

クエリが DLL への呼び出しに対して何も返さない理由はいくつかあります。

  • 呼び出しの構文が正しくありません。 x コマンド "x <call" を使用して、呼び出し>構文を確認してみてください。 x によって返されるモジュール名が大文字の場合は、これを使用します。
  • DLL はまだ読み込まれておらず、後でトレースに読み込まれます。 DLL が読み込まれてクエリをやり直した後の特定の時点にこの移動を回避するには。
  • クエリ エンジンが追跡できない呼び出しがインライン化されます。
  • クエリ パターンでは、多すぎる関数を返すワイルドカードが使用されます。 一致する関数の数が十分に少なくなるほど、クエリ パターンをより具体的にしてください。

参照

デバッガー オブジェクトでの LINQ の使用

dx (デバッガー オブジェクト モデル式の表示)

Time Travel Debugging - 概要

Time Travel Debugging - JavaScript オートメーション