Time Travel Debugging - トレースの再生
このセクションでは、タイム トラベル トレースを再生し、前後に移動する方法について説明します。
コマンド時の移動ナビゲーション
次のコマンドで末尾のマイナス記号を使用して、時間を遡ります。
コマンド |
---|
p- (ステップ バック) |
t- (トレース バック) |
g- (戻る) |
詳細については、「 タイム トラベル デバッグ - ナビゲーション コマンド」を参照してください。
リボン ボタンのタイム トラベル ナビゲーション
または、リボン ボタンを使用してトレース内を移動します。
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 (Trace) コマンドを使用してトレース内を移動することもできます。
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 に移動します。
詳細については、「 タイム トラベル デバッグ - !tt (タイム トラベル)」を参照してください。
!位置
トレース内の位置を含め、アクティブなすべてのスレッドを表示するには、 を使用 !positions
します。 詳細については、「 タイム トラベル デバッグ - !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
詳細については、「Time Travel Debugging - Extension Commands」を参照してください。!index
参照
フィードバック
https://aka.ms/ContentUserFeedback。
近日公開予定: 2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub イシューを段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、以下を参照してください:フィードバックの送信と表示