時間移動偵錯 - 重新執行追蹤
本節說明如何重新執行時間移動追蹤、向前巡覽和向後巡覽。
命令時間行進導覽
使用尾端減號搭配下列命令來回溯。
命令 |
---|
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 (步驟) 命令,在 TTD 追蹤中向前執行。
0:000> p
Time Travel Position: F:1
ntdll!LdrpInitializeProcess+0x1bc5:
7774f828 740b je ntdll!LdrpInitializeProcess+0x1bd2 (7774f835) [br=1]
0:000> p
Time Travel Position: F:2
ntdll!LdrpInitializeProcess+0x1bd2:
7774f835 83bdd0feffff00 cmp dword ptr [ebp-130h],0 ss:002b:010ff454=00000000
0:000> p
Time Travel Position: F:3
ntdll!LdrpInitializeProcess+0x1bd9:
7774f83c 0f8450e8ffff je ntdll!LdrpInitializeProcess+0x42f (7774e092) [br=1]
您也可以使用 t (Trace) 命令在追蹤中巡覽。
0:000> t
Time Travel Position: F:4
ntdll!LdrpInitializeProcess+0x42f:
7774e092 33c0 xor eax,eax
0:000> t
Time Travel Position: F:5
ntdll!LdrpInitializeProcess+0x431:
7774e094 e9f5170000 jmp ntdll!LdrpInitializeProcess+0x1c2b (7774f88e)
使用 p- 命令在 TTD 追蹤中往回跳。
0:000> p-
Time Travel Position: F:4
ntdll!LdrpInitializeProcess+0x42f:
7774e092 33c0 xor eax,eax
0:000> p-
Time Travel Position: F:3
ntdll!LdrpInitializeProcess+0x1bd9:
7774f83c 0f8450e8ffff je ntdll!LdrpInitializeProcess+0x42f (7774e092) [br=1]
您也可以使用 t- 命令來向後巡覽。
!tt 導覽命令
透過略過追蹤中的指定位置,使用 !tt 命令來向前或向後巡覽。
!tt [position]
以下列任何格式提供時間位置,以移至該時間點。
如果 [position] 是介於 0 到 100 之間的十進制數,則會在追蹤中接近該百分比。 例如
!tt 50
,移動至追蹤的一半。如果 {position} 是 #:#,其中 # 是十六進位數位,則會移至該位置。 例如,
!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
此範例顯示目前位置有八個線程。 目前的線程為 3604,標示為 『>』。
提示
顯示目前線程清單及其位置的另一種方式是使用資料模型 dx 命令:
dx -g @$curprocess.Threads.Select(t => new { IsCurrent = t.Id == @$curthread.Id, ThreadId = t.Id, Position = t.TTD.Position })
使用使用者模式 ~ (線程狀態) 命令會顯示相同的八個線程,並以 '.' 標記目前的線程:
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 命令輸出中,按兩下第三個線程旁的連結, (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
ntdll!NtWaitForWorkViaWorkerFactory+0xc:
7775396c c21400 ret 14h
使用 ~ (線程狀態) 命令來確認我們現在位於第三個線程 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
命令,請參閱 時間移動偵錯 - 擴充功能命令。