共用方式為


時間移動偵錯 - 重新執行追蹤

具有時鐘的時間移動偵錯標誌。

本節說明如何重新執行時間移動追蹤、向前巡覽和向後巡覽。

命令時間行進導覽

使用尾端減號搭配下列命令來回溯。

命令
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
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 之間的十進制數,則會在追蹤中接近該百分比。 例如 !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
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

使用 ~ (線程狀態) 命令來確認我們現在位於第三個線程 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 命令,請參閱 時間移動偵錯 - 擴充功能命令

另請參閱

時間移動偵錯 - 概觀

時間移動偵錯 - 記錄追蹤

時間移動偵錯 - 使用追蹤檔案

時間移動偵錯 - 範例應用程式逐步解說