Time Travel Debugging - トレースの再生

Small time travel logo showing clock.

このセクションでは、タイム トラベル トレースを再生し、前後に移動する方法について説明します。

コマンド時間の移動ナビゲーション

次のコマンドで末尾のマイナス記号を使用して、時間を遡ります。

コマンド
p- (ステップ バック)
t- (トレース バック)
g- (戻る)

詳細については、「 タイム トラベル デバッグ - ナビゲーション コマンド」を参照してください。

リボン ボタンの時間移動ナビゲーション

または、リボン ボタンを使用してトレース内を移動します。

Screen shot of WinDbg Preview showing start recording checkbox.

TTD トレース再生の例

g- コマンドを使用して、イベントまたは TTD トレースの先頭に到達するまで後方に実行します。 後方実行を停止できるイベントは、前方実行を停止するイベントと同じです。 この例では、トレースの開始に達しています。

0:000> g-
TTD: Start of trace reached.
(3f78.4274): Break instruction exception - code 80000003 (first/second chance not available)
Time Travel Position: 29:0
ntdll!ZwTestAlert+0x14:
00007ffc`61f789d4 c3              ret

p (Step) コマンドを使用して、TTD トレースをステップフォワードします。

0:000> p
Time Travel Position: F:1
eax=0173a5b0 ebx=00fd8000 ecx=7774f821 edx=0f994afc esi=0f99137c edi=00de0000
eip=7774f828 esp=010ff34c ebp=010ff584 iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
ntdll!LdrpInitializeProcess+0x1bc5:
7774f828 740b            je      ntdll!LdrpInitializeProcess+0x1bd2 (7774f835) [br=1]
0:000> p
Time Travel Position: F:2
eax=0173a5b0 ebx=00fd8000 ecx=7774f821 edx=0f994afc esi=0f99137c edi=00de0000
eip=7774f835 esp=010ff34c ebp=010ff584 iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
ntdll!LdrpInitializeProcess+0x1bd2:
7774f835 83bdd0feffff00  cmp     dword ptr [ebp-130h],0 ss:002b:010ff454=00000000
0:000> p
Time Travel Position: F:3
eax=0173a5b0 ebx=00fd8000 ecx=7774f821 edx=0f994afc esi=0f99137c edi=00de0000
eip=7774f83c esp=010ff34c ebp=010ff584 iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
ntdll!LdrpInitializeProcess+0x1bd9:
7774f83c 0f8450e8ffff    je      ntdll!LdrpInitializeProcess+0x42f (7774e092) [br=1]

t (トレース) コマンドを使用してトレース内を移動することもできます。

0:000> t
Time Travel Position: F:4
eax=0173a5b0 ebx=00fd8000 ecx=7774f821 edx=0f994afc esi=0f99137c edi=00de0000
eip=7774e092 esp=010ff34c ebp=010ff584 iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
ntdll!LdrpInitializeProcess+0x42f:
7774e092 33c0            xor     eax,eax
0:000> t
Time Travel Position: F:5
eax=00000000 ebx=00fd8000 ecx=7774f821 edx=0f994afc esi=0f99137c edi=00de0000
eip=7774e094 esp=010ff34c ebp=010ff584 iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
ntdll!LdrpInitializeProcess+0x431:
7774e094 e9f5170000      jmp     ntdll!LdrpInitializeProcess+0x1c2b (7774f88e)

p- コマンドを使用して、TTD トレースを後方にステップバックします。

0:000> p-
Time Travel Position: F:4
eax=0173a5b0 ebx=00fd8000 ecx=7774f821 edx=0f994afc esi=0f99137c edi=00de0000
eip=7774e092 esp=010ff34c ebp=010ff584 iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
ntdll!LdrpInitializeProcess+0x42f:
7774e092 33c0            xor     eax,eax
0:000> p-
Time Travel Position: F:3
eax=0173a5b0 ebx=00fd8000 ecx=7774f821 edx=0f994afc esi=0f99137c edi=00de0000
eip=7774f83c esp=010ff34c ebp=010ff584 iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
ntdll!LdrpInitializeProcess+0x1bd9:
7774f83c 0f8450e8ffff    je      ntdll!LdrpInitializeProcess+0x42f (7774e092) [br=1]

t- コマンドを使用して、時間内に後方に移動することもできます。

!tt ナビゲーション コマンド

!tt コマンドを使用して、トレース内の特定の位置にスキップして、前後に移動します。

!tt [position]

次のいずれかの形式で時刻位置を指定して、その時点に移動します。

  • [position] が 0 から 100 の間の 10 進数の場合、トレースはその約パーセントに移動します。 たとえば、 !tt 50 トレースの途中まで移動します。

  • {position} が #:#で、#が 16 進数の場合、その位置に移動します。 たとえば、 !tt 1A0:12F トレース内の位置 1A0:12F に移動します。

詳細については、「 Time Travel Debugging - !tt (タイム トラベル)」を参照してください。

!positions

トレース内の位置を含め、すべてのアクティブなスレッドを表示するために使用 !positions します。 詳細については、「 Time Travel Debugging - !positions (タイム トラベル)」を参照してください。

0:000> !positions
>*Thread ID=0x1C74 - Position: F:2
 Thread ID=0x1750 - Position: A5:0
 Thread ID=0x3FFC - Position: 200:0
 Thread ID=0x36B8 - Position: 403:0
 Thread ID=0x3BC4 - Position: 5F2:0
 Thread ID=0x392C - Position: B45:0
 Thread ID=0x32B4 - Position: C87:0
 Thread ID=0x337C - Position: DF1:0
* indicates an actively running thread

この例は、現在の位置に 8 つのスレッドがあることを示しています。 現在のスレッドは 3604 で、''> でマークされています。

ヒント

スレッドの現在のリストとその位置を表示するもう 1 つの方法は、データ モデル dx コマンドを使用することです。

dx -g @$curprocess.Threads.Select(t => new { IsCurrent = t.Id == @$curthread.Id, ThreadId = t.Id, Position = t.TTD.Position })

ユーザー モード ~ (スレッドの状態) コマンドを使用すると、同じ 8 つのスレッドが表示され、現在のスレッドに '.' というマークが付けられます。

0:000> ~
.  0  Id: 954.1c74 Suspend: 4096 Teb: 00fdb000 Unfrozen
   1  Id: 954.1750 Suspend: 4096 Teb: 00fea000 Unfrozen
   2  Id: 954.3ffc Suspend: 4096 Teb: 00fde000 Unfrozen
   3  Id: 954.36b8 Suspend: 4096 Teb: 00fe1000 Unfrozen
   4  Id: 954.3bc4 Suspend: 4096 Teb: 00fe4000 Unfrozen
   5  Id: 954.392c Suspend: 4096 Teb: 00fed000 Unfrozen
   6  Id: 954.32b4 Suspend: 4096 Teb: 00ff0000 Unfrozen
   7  Id: 954.337c Suspend: 4096 Teb: 00ff3000 Unfrozen

!positions コマンド出力で、3 番目のスレッド (3FFC) の横にあるリンクをクリックして、トレース内のその位置 (200:0) に移動します。

0:002> !tt 200:0
Setting position: 200:0
(954.3ffc): Break instruction exception - code 80000003 (first/second chance not available)
Time Travel Position: 200:0
eax=00000000 ebx=012da718 ecx=7775396c edx=00000000 esi=012e1848 edi=012e1a08
eip=7775396c esp=014cf9f8 ebp=014cfbfc iopl=0         nv up ei ng nz ac po cy
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000293
ntdll!NtWaitForWorkViaWorkerFactory+0xc:
7775396c c21400          ret     14h

~ (スレッドの状態) コマンドを使用して、3 番目のスレッドである 3ffc に配置されていることを確認します。

0:002> ~
   0  Id: 954.1c74 Suspend: 4096 Teb: 00fdb000 Unfrozen
   1  Id: 954.1750 Suspend: 4096 Teb: 00fea000 Unfrozen
.  2  Id: 954.3ffc Suspend: 4096 Teb: 00fde000 Unfrozen
   3  Id: 954.36b8 Suspend: 4096 Teb: 00fe1000 Unfrozen
   4  Id: 954.3bc4 Suspend: 4096 Teb: 00fe4000 Unfrozen
   5  Id: 954.392c Suspend: 4096 Teb: 00fed000 Unfrozen
   6  Id: 954.32b4 Suspend: 4096 Teb: 00ff0000 Unfrozen
   7  Id: 954.337c Suspend: 4096 Teb: 00ff3000 Unfrozen

注意

スレッド番号である #~s#は、指定されたスレッドにも切り替わりますが、トレース内の現在の位置は変更されません。 !tt を使用して別のスレッドの位置に移動すると、メモリから読み取った値 (およびデバッガー) がその位置で検索されます。 ~s# でスレッドを切り替えると、デバッガーは内部的に現在の位置を変更しません。これはすべてのメモリ クエリに使用されます。 これは主にこのように機能するため、 ~s# は デバッガーの内部ループをリセットする必要はありません。

タイム トラベル デバッグ拡張機能コマンド

コマンドの!tt!positions!index詳細については、「Time Travel Debugging - Extension Commands」を参照してください。

参照

Time Travel Debugging - 概要

タイム トラベル デバッグ - トレースの記録

Time Travel Debugging - トレース ファイルの使用

Time Travel Debugging - サンプル アプリのチュートリアル