本文說明如何及何時使用 TTD.exe 命令列公用程式來記錄「時間旅行除錯」(TTD) 追蹤。 TTD.exe 命令列公用程式可讓您記錄應用程式或進程執行、將它儲存至追蹤檔案,並在 WinDbg 中重新執行,以診斷程式代碼執行問題。
在本文中,您將了解:
- 何時使用 TTD.exe 與 WinDbg UI
- 如何安裝和設定 TTD.exe
- 記錄痕跡的三種方式(啟動、連結、監控)
- 命令列選項和進階案例
使用命令行公用程式TTD.exe時機
時間旅行偵錯 (TTD) 可讓您記錄應用程式或進程的程式碼執行,並將它儲存在追蹤檔案中。 您可以在 Windows 偵錯工具中播放檔案,以找出程式碼執行的問題。
在許多情況下,使用 TTD 來記錄應用程式或程式最簡單的方式是直接從 WinDbg UI。 如果您是時間旅行偵錯的新手,請從 時間旅行偵錯 - 概觀 開始,以使用 WinDbg 介面瞭解基本概念。
您可能有只需要 TTD 命令列記錄器的案例:在電腦上錄製而不安裝偵錯工具、進階錄製案例、測試自動化等等。 在這些案例中,您只能透過 URL 安裝 TTD 命令列記錄器。
TTD 錄製會影響錄製的過程
TTD 錄音是一種侵入性技術。 您會注意到錄製時正在運行的應用程式或進程速度會降低 5 倍至 20 倍或更多,具體取決於應用程式和您選擇的錄製選項。
建立的追蹤檔案會隨著時間成長,而且可能需要大量的儲存空間。 請在最短的時間內進行追蹤,收集感興趣的程式活動,然後儘快關閉追蹤。
一旦 TTD 附加至進程,就無法自行移除。 關閉應用程式,或在 TTD 錄製完成後結束程式。 對於系統關鍵進程,此動作需要重新啟動作業系統。
TTD 錄製可能包含個人識別或安全性相關資訊
這很重要
TTD 錄製會擷取記憶體內容,而且可能包含個人識別或安全性相關資訊,包括但不限於檔案路徑、登錄、記憶體或檔案內容。 具體資訊取決於記錄過程中的目標進程活動。
下載並安裝 TTD.exe 命令列公用程式 (偏好的方法)
從 https://aka.ms/ttd/download下載 TTD 命令列公用程式。
選取 安裝,系統將下載並安裝 TTD。 TTD 命令會新增至系統路徑,並在安裝完成時在命令提示字元上使用。
提示
安裝後,打開一個新的命令提示符並鍵入 ttd.exe -help 以驗證安裝成功。
如果您遇到安裝困難,請參閱 針對應用程式安裝程式檔案進行安裝問題疑難排解。
在某些電腦上,您可能需要安裝 適用於 Windows 10 的 Microsoft 應用程式安裝程式。 它可在 Windows 的 Microsoft Store 應用程式中使用。 從 Windows 10 1809 開始,應用程式安裝程式支援 Windows 封裝管理員。
下載並安裝 TTD.exe 命令列公用程式(離線方法)
雖然慣用的安裝方法是使用應用程式安裝程式,但您也可以下載 TTD 命令行套件,並手動擷取檔案。 以下是兩種方式。
從已安裝的 TTD.exe 命令列公用程式中解壓縮檔案
如果您已安裝 TTD 命令列公用程式,您可以從已安裝的位置擷取檔案。 在 PowerShell 中,執行下列命令以尋找已安裝的位置:
(Get-AppxPackage | where Name -eq 'Microsoft.TimeTravelDebugging').InstallLocation
從那裡,您可以將所有二進位檔(*.dll、 *.exe、 *.sys)複製到新位置。 以下是在 PowerShell 中執行此操作的一種方法:
robocopy.exe (Get-AppxPackage | where Name -eq 'Microsoft.TimeTravelDebugging').InstallLocation c:\myttd *.exe *.dll *.sys /E /XD AppxMetadata
將 「c:\myttd」 取代為您選擇的目的地。 結果看起來像這樣(在 x64 機器上):
ls -Recurse c:\myttd
Directory: C:\myttd
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 11/9/2023 2:43 PM x86
-a--- 11/9/2023 2:43 PM 79240 ProcLaunchMon.sys
-a--- 11/9/2023 2:43 PM 112568 TTD.exe
-a--- 11/9/2023 2:43 PM 309176 TTDInject.exe
-a--- 11/9/2023 2:43 PM 55328 TTDLoader.dll
-a--- 11/9/2023 2:43 PM 821176 TTDRecord.dll
-a--- 11/9/2023 2:43 PM 1222584 TTDRecordCPU.dll
-a--- 11/9/2023 2:43 PM 63416 TTDRecordUI.dll
Directory: C:\myttd\x86
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 11/9/2023 2:43 PM 247728 TTDInject.exe
-a--- 11/9/2023 2:43 PM 42928 TTDLoader.dll
-a--- 11/9/2023 2:43 PM 1128480 TTDRecordCPU.dll
請注意,x86 二進位檔位於子目錄中。 如果您不需要記錄 32 位元進程,您可以刪除此資料夾(並且您可以新增至 /xd x86 robocopy 命令以避免從一開始就複製它)。 ARM64 版本沒有任何子目錄。
只有在您想要使用 UI 來控制錄製時,才需要 TTDRecordUI.dll 檔案。 如果您不需要 UI,可以刪除此檔案。
下載並手動解壓縮 TTD.exe 命令列公用程式套件
如果您不想安裝 TTD 命令列公用程式,您可以下載套件並手動解壓縮檔案。 下列 PowerShell 腳本:
- 從 https://aka.ms/ttd/download取得目前版本 TTD 的 URL。
- 下載 MSIX 套件組合。
- 從 MSIX 封裝中擷取要求架構的 MSIX。
- 從 MSIX 擷取 TTD 二進位檔。
param(
$OutDir = ".",
[ValidateSet("x64", "x86", "arm64")]
$Arch = "x64"
)
# Ensure the output directory exists
if (!(Test-Path $OutDir)) {
$null = mkdir $OutDir
}
# Ensure the temp directory exists
$TempDir = Join-Path $OutDir "TempTtd"
if (!(Test-Path $TempDir)) {
$null = mkdir $TempDir
}
# Determine if the destination already contains binaries
$extensions = @('.dll', '.exe', '.sys')
$existingBinaries = (Get-ChildItem -recurse $OutDir | Where-Object Extension -In $extensions).Count -gt 0
# Download the appinstaller to find the current uri for the msixbundle
Invoke-WebRequest https://aka.ms/ttd/download -OutFile $TempDir\ttd.appinstaller
# Download the msixbundle
$msixBundleUri = ([xml](Get-Content $TempDir\ttd.appinstaller)).AppInstaller.MainBundle.Uri
if ($PSVersionTable.PSVersion.Major -lt 6) {
# This is a workaround to get better performance on older versions of PowerShell
$ProgressPreference = 'SilentlyContinue'
}
# Download the msixbundle (but name as zip for older versions of Expand-Archive)
Invoke-WebRequest $msixBundleUri -OutFile $TempDir\ttd.zip
# Extract the 3 msix files (plus other files)
Expand-Archive -DestinationPath $TempDir\UnzippedBundle $TempDir\ttd.zip -Force
# Expand the build you want - also renaming the msix to zip for Windows PowerShell
$fileName = switch ($Arch) {
"x64" { "TTD-x64" }
"x86" { "TTD-x86" }
"arm64" { "TTD-ARM64" }
}
# Rename msix (for older versions of Expand-Archive) and extract the debugger
Rename-Item "$TempDir\UnzippedBundle\$fileName.msix" "$fileName.zip"
Expand-Archive -DestinationPath "$OutDir" "$TempDir\UnzippedBundle\$fileName.zip"
# Delete the temp directory
Remove-Item $TempDir -Recurse -Force
# Remove unnecessary files, if it is safe to do so
if (-not $existingBinaries) {
Get-ChildItem -Recurse -File $OutDir |
Where-Object Extension -NotIn $extensions |
Remove-Item -Force
Remove-Item -Recurse -Force (Join-Path $OutDir "AppxMetadata")
} else {
Write-Host "Detected pre-existing binaries in '$OutDir' so did not remove any files from TTD package."
}
假設您將上述腳本儲存為 Get-Ttd.ps1,請依照以下方式執行,將 x64 二進位檔下載至 c:\myttd 目錄:
md c:\myttd
cd c:\myttd
.\Get-Ttd.ps1
或指定輸出目錄和架構:
.\Get-Ttd.ps1 -OutDir c:\myttd-arm64 -Arch arm64
將 「c:\myttd」 或 「c:\myttd-arm64」 取代為您選擇的目的地。
使用 TTD.exe 命令列工具記錄追蹤記錄
您可以透過三種方式進行追蹤記錄:
| 方法 | 適用對象 | 範例案例 |
|---|---|---|
| 啟動 | 使用特定引數啟動新程序 | 錄製命令列工具,例如 ping.exe |
| 附 | 記錄已執行的程序 | 偵錯服務或長時間執行的應用程式 |
| 監視器 | 每次進程啟動時自動記錄 | 捕捉間歇性問題或啟動問題 |
開始記錄程式之後,觸發您要偵錯的問題。 您可能會開啟有問題的檔案或選擇應用程式中的特定按鈕來導致感興趣的事件。 當您錄製的應用程式自然結束或當機時,追蹤檔案就會完成。
提示
錄製 TTD 追蹤需要系統管理許可權。 一般而言,您會從系統管理員命令提示字元執行 ttd.exe。
如需使用 WinDbg 記錄時間旅行追蹤的詳細資訊,請參閱 時間旅行偵錯 - 記錄追蹤。
啟動進程
-launch <Program> [<arguments>]
啟動和追蹤程式(預設模式)。
此模式是唯一允許您將參數傳遞給程式的模式。 程式以與 TTD.exe(作為管理員)相同的權限啟動。 使用 -attach 或 -monitor 來記錄程式及其一組一般許可權。
包含 -launch 是可選的,但您可以為了更加清楚而使用它。
第一個不以 - 或 / 開頭的無法辨識的引數會假設為啟動的可執行路徑,而任何後續引數都會假設為該程式的引數。
例如,用於 TTD.exe notepad.exe 啟動和記錄記事本。 當您關閉記事本時,追蹤會停止。
如需使用範例,請參閱 案例使用範例 - 錄製程式。
連結至處理序
-attach <PID>
附加至進程識別碼所指定的執行中進程。 使用「工作管理員」或「工作清單」公用程式來識別處理程序編號。 如需詳細資訊,請參閱 尋找進程標識符。
例如,用 TTD.exe -attach 21440 -out C:\traces\MyTraceFile.run 來啟動並記錄識別碼為 21440 的進程,並將追蹤儲存在 MyTraceFile.run 中。
在執行 TTD.exe 之前,請確定目錄存在 (C:\traces 在此範例中)。
例如,有關用法,請參閱 案例 - 找出並附加至執行中的進程。
監視進程
-monitor <Program>
監視器選項可讓您在每次啟動程式時監視和追蹤程式。 若要使用此選項,您必須使用 -out指定輸出位置的完整路徑。
若要停止監控,請按 Ctrl+C。
與其他方法相比,監視的主要優點包括:
- 您可以正常啟動目標應用程式,不需要找出命令行來啟動它。
- 目標應用程式會以其一般權限執行。 如果您直接從 ttd.exe啟動應用程式,它會以提升權限啟動,而該變更可能會影響程式的行為。
- 它對於自動化很有用(使用腳本來監視程式的啟動並收集追蹤)。
您可以多次指定 -monitor 選項來監視多個程式。
如需使用範例,請參閱 案例使用範例 - 監視程式。
命令列選項
語法
TTD.exe [options] [mode] [program [<arguments>]]
-? | -help
顯示命令行說明。
模式
-launch <Program> [<arguments>]
啟動和追蹤程式(預設模式)。
此模式是唯一允許您將參數傳遞給程式的模式。 選項 -launch 必須是命令行中的最後一個 TTD 選項,後面接著要啟動的程式,以及程式需要的任何自變數。 如果您未指定模式,工具會將其視為啟動。 例如, TTD.exe -out C:\traces ping.exe msn.com 會被視為啟動。
-attach <PID>
附加至進程識別碼所指定的執行中進程。 使用「工作管理員」或「工作清單」公用程式來識別處理程序 ID。 如需詳細資訊,請參閱 尋找進程標識符。
-monitor <Program>
每次啟動程式或服務時追蹤它們(直到重新啟動)。 若要使用此選項,您必須使用 -out指定輸出位置的完整路徑。
基本命令行選項
-out <path>
指定追蹤檔名或目錄。 如果您指定目錄,則它必須已經存在。 如果您指定檔名,則檔名不得存在。
-noUI
停用手動控制錄製的UI。 將此選項用於 不需要互動式控制的自動化案例。
如果您未選取此選項,則在錄製處於作用中狀態時會出現一個小型 UI:
UI 提供兩個控制項:
- 追蹤關閉 - 停止追蹤,應用程式繼續執行
- 結束應用程式 - 關閉應用程式並停止追蹤
-accepteula
使用此選項可接受 EULA 使用者許可協定。 在檢閱並接受 EULA 之後,在自動化案例中使用此選項。
TTD 第一次執行時會顯示最終用戶許可協議(EULA)。 輸入 Y 或 N 以接受 EULA。 一旦接受,EULA 將不再出現在啟動時。 如果您不接受 EULA,TTD 會結束並在下次執行時顯示 EULA。
追蹤控制
-stop <process name> | <PID> | all
停止追蹤指定的處理程序名稱、PID 或 “all”。
-wait <timeout>
最多等待指定的秒數,讓系統上的所有追蹤會話結束。 指定 -1 以無限等待。
-tracingOff
啟動應用程式,並關閉追蹤錄製。 您可以使用 [UI] 複選框,在關閉追蹤之後重新開啟追蹤功能。
其他命令行選項
-children
記錄目標程序及任何由目標建立的程序。 每個子進程都會記錄到自己的追蹤檔案中。
-cmdLineFilter "<string>"
如果目標進程的命令列包含字串,請記錄其進程。 此選項僅適用於 -monitor 模式。 當命令列引數唯一標識您感興趣的進程時,它很有用。 例如,只有在指令行上出現 specialfile.txt 時,才會記錄 notepad.exe。
-cleanup
卸載行程監視器驅動程式。
追蹤行為設定
-timestampFilename
將時間戳加入至追蹤檔名的最後一個部分。 例如: ping_2023-06-17_103116.run 。
若要使用時間戳記錄製ping.exe並將其包含在檔案名稱中,請使用此指令。
ttd.exe -out c:\traces -timestampFilename ping.exe msn.com
依預設,記錄器會循序掃描輸出目錄,以尋找未使用的檔案名稱。 如果您錄製 ping.exe,記錄器會嘗試 ping01.run、 ping02.run、 依此類推,直到找到未使用的檔案名稱為止。 對於大部分的案例,此命名方法已足夠。 但是,如果您想多次錄製同一個程序,當存在大量現有文件時,默認的文件命名算法可能會變得低效。
-ring
追蹤到環形緩衝區。 檔案大小不會超過 指定的限制 -maxFile。 僅保存符合指定大小的錄音的最後部分。
-maxFile <size>
以 MB 為單位的追蹤檔案大小上限。 在完整追蹤模式時,預設值為 1,024 GB,最小值為 1 MB。 在環緩衝區模式下,預設值為 2,048 MB,最小值為 1 MB,最大值為 32,768 MB。
32 位元進程上記憶體內環的預設值為 256 MB。
-maxConcurrentRecordings <count>
在任何一個時間點進行中的錄製數目上限。 如果您未指定此值,則可以同時進行無限數量的錄製。
-numVCpu <number>
指定追蹤時要保留和使用的虛擬 CPU 數目。 此值會影響由TTD置於客體進程記憶體上的記憶體總負荷。 如果您未指定此值,則每個平臺的預設值為 x64/ARM64 的 55,x86 的預設值為 32。
只有在記憶體不足時,才變更此設定以限制記憶體使用。 降低此 numVCpu 值可能會嚴重影響追蹤的效能,而且應該只針對記憶體使用問題來處理。
如果 TTD.exe 無法錄製,或 .out 檔案顯示模擬為 0 秒,則可能使用 -numVCpu 來讓錄製成功。
-replayCpuSupport <support>
指定預期協助重現追蹤的 CPU 支援。 建議使用預設設定來在機器之間移植追蹤,但您可以使用其他選項來產生較小的追蹤檔案並更快地記錄,具體取決於目標程式使用的特定指令。
<support> 值
| 值 | Description |
|---|---|
Default |
預設的 CPU 支援,只需要重放 CPU 中基本的常見支援功能即可。 |
MostConservative |
在重播的 CPU 中不需要特殊支援。 適用於在完全不同的 CPU 架構上重播的追蹤,例如 ARM64 CPU 上的 Intel 追蹤。 |
MostAggressive |
假設重播 CPU 與用於錄製的 CPU 相似且功能相同或更高。 |
IntelAvxRequired |
假設重播 CPU 是支援 AVX 的 Intel/AMD 64 位元 CPU。 |
IntelAvx2Required |
假設重播 CPU 是支援 AVX2 的 Intel/AMD 64 位元 CPU。 |
減少追蹤的額外負荷
雖然 TTD 對於它所執行的功能非常有效率(完整指令層級追蹤平均編碼為小於一個字節/指令),但錄製時仍會有明顯的額外負荷。 新式 CPU 每秒可以執行數十億個指令,甚至讓一個字節/指令成本高昂。 在許多情況下,不需要錄製整個過程。
下列選項可用來減少追蹤的額外負荷:
-module <module name>
只記錄指定的模組(例如comdlg32.dll),以及它所呼叫的程序代碼。 這可以是可執行檔本身或任何可執行檔所載入的 DLL。 您可以多次指定此選項來記錄多個模組。
使用此選項時,目標進程會以完整速度執行,直到執行指定模組中的程式代碼為止。 TTD 接著會記錄執行過程,直到執行離開指定的模組,這時錄製功能會被關閉,目標系統會恢復全速運行。 因為開啟/關閉錄製的成本很高,因此當指定的模組呼叫程式中的其他模組時,TTD 會讓錄製保持開啟。
-recordmode <Automatic | Manual>
通常錄製功能會在 TTD 插入到目標程序時立即啟動(默認為「自動」模式)。 如果您的程式利用 TTD 的進行中錄製 API 來控制錄製何時發生,則可以使用「手動」模式以全速執行,直到您的程式呼叫 API 以開始錄製為止。
使用這些選項可能會導致記錄額外負荷和追蹤檔案大小大幅減少。 使用這些選項對記錄的追蹤進行偵錯,與整個進程的追蹤並無不同。 每當到達錄製關閉之追蹤中的位置時,追蹤中的下一個指令就是錄製繼續時執行的第一個指令。
事件相關設定
-passThroughExit
將客體進程結束值傳遞為TTD.exe的結束值。 此值可透過 %ERRORLEVEL% 變數批處理檔使用。 PowerShell 和其他命令行環境也提供取得進程結束值的機制。
-onInitCompleteEvent <eventName>
允許在追蹤初始化完成時發出事件訊號。
情境使用範例 - 記錄過程
選擇符合您需求的案例:
案例 - 啟動和記錄 Windows 應用程式
在此案例中,您會啟動記事本並建立追蹤。
- 使用該
-launch選項啟動記事本並記錄它。
C:\TTD> TTD.exe -launch notepad.exe
Launching 'notepad.exe'
Recording process (PID:9960) on trace file: C:\TTD\notepad01.run
notepad.exe(x64) (PID:9960): Process exited with exit code 0 after 12984ms
Full trace dumped to C:\TTD\notepad01.run
- 會出現一個小型應用程式功能表,顯示追蹤已開啟。
- 當您關閉應用程式時,它會產生追蹤檔案。 在此範例中,追蹤檔案名為 notepad01.run。
案例 - 使用傳遞的參數啟動和記錄 Windows 應用程式
在此案例中,您會啟動 ping 並將位址傳遞至 ping 作為參數。
- 在此範例中,您會省略該
-launch選項,因為它是預設模式。
C:\TTD> TTD.exe ping.exe msn.com
Launching 'ping.exe msn.com'
Recording process (PID:24044) on trace file: C:\TTD\ping01.run
Pinging msn.com [204.79.197.219] with 32 bytes of data:
Reply from 204.79.197.219: bytes=32 time=22ms TTL=118
Reply from 204.79.197.219: bytes=32 time=21ms TTL=118
Reply from 204.79.197.219: bytes=32 time=25ms TTL=118
Reply from 204.79.197.219: bytes=32 time=21ms TTL=118
Ping statistics for 204.79.197.219:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 21ms, Maximum = 25ms, Average = 22ms
ping.exe(x64) (PID:24044): Process exited with exit code 0 after 3390ms
Full trace dumped to C:\TTD\ping01.run
- 當您關閉應用程式時,它會產生追蹤檔案。 在此範例中,追蹤檔案名為ping01.run。
情境 - 尋找並連接到正在運行的程序
在此案例中,您會啟動記事本、尋找其進程識別碼,並藉由附加至執行中的應用程式來建立追蹤。
啟動目標應用程式,在此範例中為記事本。
使用 TaskList 或其他方法來尋找進程 ID。 如需詳細資訊,請參閱 尋找進程標識符。
C:\TTD> TaskList
...
Notepad.exe 21440 Console 1 73,020 K
...
- 使用處理程序 ID 及選項
-attach來附加並記錄。 或者,使用-out指定追蹤檔案的檔名。
C:\TTD> TTD.exe -attach 21440 -out C:\TTD\MyTraceFile.run
Attaching to 21440
Recording process (PID:21440) on trace file: C:\TTD\MyTraceFile.run
(x64) (PID:21440): Process exited with exit code 0 after 26672ms
Full trace dumped to C:\TTD\MyTraceFile.run
情境 - 記錄父程序及其子程序
在此案例中,您會記錄下父處理程序及其子處理程序。 由於某些應用程式會使用許多子進程,因此包含子系的族群追蹤檔案可能會變得相當大。
- 請指定
-children選項和要記錄的父應用程式的名稱。
此範例會記錄將 ping.exe 作為子程序來啟動 cmd.exe。
ttd.exe -out d:\traces -children cmd.exe /C ping.exe msn.com
Microsoft (R) TTD 1.01.11
Release: 1.11.0.0
Copyright (C) Microsoft Corporation. All rights reserved.
Launching 'cmd.exe /C ping.exe msn.com'
Recording process (PID:48200) on trace file: d:\traces\cmd01.run
Recording process (PID:53724) on trace file: d:\traces\PING01.run
Pinging msn.com [204.79.197.219] with 32 bytes of data:
Reply from 204.79.197.219: bytes=32 time=6ms TTL=117
Reply from 204.79.197.219: bytes=32 time=6ms TTL=117
Reply from 204.79.197.219: bytes=32 time=7ms TTL=117
Reply from 204.79.197.219: bytes=32 time=7ms TTL=117
Ping statistics for 204.79.197.219:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 6ms, Maximum = 7ms, Average = 6ms
(x64) (PID:53724): Process exited with exit code 0 after 3516ms
Trace family nesting level is 1; Parent process ID is 48200
Full trace dumped to d:\traces\PING01.run
...
- 系統會建立多個追蹤檔案:一個用於父進程,另一個用於每個子進程的追蹤檔案。 WinDbg 一次只會開啟一個追蹤檔案,因此如果您想要同時偵錯每個追蹤,就必須針對每個追蹤執行個別的 WinDbg 實例。
案例使用範例 - 監視程式
情境 - 監視程式啟動和開始錄製
在此案例中,請使用選項 -monitor 來記錄所有目前執行中的實例和未來的 notepad.exe 實例,直到系統重新啟動或您使用 Ctrl+C 結束 ttd.exe 為止。 您需要 -out 監視選項,且輸出資料夾必須已存在。
- 監控和追蹤當前和未來的 notepad.exe實例。
C:\TTD> TTD.exe -out C:\TTD\ -monitor notepad.exe
Microsoft (R) TTD 1.01.11
Release: 1.11.121.0
Copyright (C) Microsoft Corporation. All rights reserved.
The Process Launch Monitor driver is not installed
Successfully installed the Process Launch Monitor driver
Recording process Notepad.exe(15904) From parent process explorer.exe(8440)
Recording process (PID:15904) on trace file: C:\TTD\notepad01.run
Recording process Notepad.exe(19920) From parent process explorer.exe(8440)
Recording process (PID:19920) on trace file: C:\TTD\notepad02.run
(x64) (PID:19920): Process exited with exit code 0 after 1281ms
Full trace dumped to C:\TTD\notepad02.run
(x64) (PID:15904): Process exited with exit code 0 after 30719ms
Full trace dumped to C:\TTD\notepad01.run
- 在此範例中,您會在追蹤開始後載入兩個 notepad.exe 執行個體。 當您擷取感興趣的活動時,請在命令提示字元中使用 CTRL-C 來停止錄製。
案例 - 監視程序啟動的兩個程式
在此實務範例中,請使用選項 -monitor 來監視及記錄兩個應用程式。
- 監控和追蹤當前和未來的 notepad.exe 和 ping.exe實例。
C:\TTD> TTD.exe -out C:\TTD\ -monitor notepad.exe -monitor ping.exe
Microsoft (R) TTD 1.01.11
Release: 1.11.121.0
Copyright (C) Microsoft Corporation. All rights reserved.
Successfully uninstalled the Process Launch Monitor driver
Successfully installed the Process Launch Monitor driver
Recording process Notepad.exe(17972) From parent process explorer.exe(8440)
Recording process (PID:17972) on trace file: C:\TTD\Notepad01.run
Tracking process svchost.exe(7824) From parent process services.exe(1292)
Tracking process sppsvc.exe(10376) From parent process services.exe(1292)
Tracking process ClipUp.exe(15108) From parent process svchost.exe(7824)
Tracking process ClipUp.exe(21180) From parent process ClipUp.exe(15108)
Tracking process consent.exe(24280) From parent process svchost.exe(892)
Tracking process ctfmon.exe(24508) From parent process svchost.exe(5064)
Tracking process wt.exe(10768) From parent process explorer.exe(8440)
Tracking process WindowsTerminal.exe(23296) From parent process wt.exe(10768)
Tracking process OpenConsole.exe(6816) From parent process WindowsTerminal.exe(23296)
Tracking process powershell.exe(15956) From parent process WindowsTerminal.exe(23296)
Tracking process git.exe(3656) From parent process powershell.exe(15956)
Tracking process git.exe(1928) From parent process git.exe(3656)
Tracking process git.exe(20312) From parent process powershell.exe(15956)
Tracking process git.exe(5712) From parent process git.exe(20312)
Tracking process csc.exe(16144) From parent process powershell.exe(15956)
Tracking process cvtres.exe(19488) From parent process csc.exe(16144)
Recording process PING.EXE(21468) From parent process powershell.exe(15956)
Recording process (PID:21468) on trace file: C:\TTD\PING01.run
(x64) (PID:21468): Process exited with exit code 1 after 234ms
Full trace dumped to C:\TTD\PING01.run
Tracking process Teams.exe(10060) From parent process Teams.exe(2404)
Tracking process cmd.exe(21796) From parent process powershell.exe(15956)
Recording process PING.EXE(364) From parent process cmd.exe(21796)
Recording process (PID:364) on trace file: C:\TTD\PING02.run
(x64) (PID:364): Process exited with exit code 1 after 234ms
Full trace dumped to C:\TTD\PING02.run
- 在此範例中,您先載入 notepad.exe,然後在追蹤開始後再載入 ping.exe。 當您擷取感興趣的活動時,請在命令提示字元中使用 CTRL-C 來停止錄製。
使用追蹤檔案的提示
- 與其他人共用追蹤時,請僅共用 .run 檔案。 索引檔 (.idx) 可以與 .run 檔一樣大,而且會在 WinDbg 載入追蹤檔時自動建立。
- 與他人協作時,分享與問題相關的任何相關追蹤位置。 共同作業者可以使用
!tt x:y命令,在程式代碼執行時移至該確切的時間點。 您可以在錯誤描述中包含時間位置範圍,以追蹤可能發生問題的位置。 - 回報 TTD 的問題時,如果您提供 .run 檔案,也請提供 .out 檔案。 此新增功能可以確認錄製過程是否正常運作。
- 追蹤檔案(.run)容易壓縮。
疑難排解 TTD.exe 錄製問題
可能會發生追蹤檔錯誤。 如需詳細資訊,請參閱 時間移動偵錯 - 疑難解答。
您可以使用 .out 檔案進行疑難排解。 範例輸出檔案顯示功能追蹤,最後的結束代碼為零。
Microsoft (R) TTDRecord 1.01.11
Release: 1.11.47.0
Copyright (C) Microsoft Corporation. All rights reserved.
Initializing Time Travel Debugging for Attach to 9916
Time: 05/08/2023 17:07:15
OS:10.0.25314 EDITION:x64
SessionID: 008F918C-B8A7-4C4E-B91B-34CFC953C501
(TTD::ManageTTDTrace:2725)
Running
(TTD::StartGuestProcess:1512)
Group tracing GUID: B84DF180-DA54-46E5-9019-73690C689979
Running "C:\WINDOWS\SYSTEM32\TTDInject.exe" /duration 1 /InjectMode LoaderForCombinedRecording /ClientParams "37 C:\TTD\Notepad03.run 0 0 0 0 0 0 0 0 c06001 0" /RecordScenario 268435458 /attach 9916 -TraceFileHandle 4f8 -GuestEventHandle 380 -ClientEventHandle 384 -ActiveEventHandle 4f4 -MutexHandle 46c -CommunicationBufferHandle 3c0 -SharedSequenceMutexHandle 3b8 -SharedSequenceBufferHandle 330 /TelemetryFeatureSessionId "008F918C-B8A7-4C4E-B91B-34CFC953C501"
(TTD::StartGuestProcess:1955)
Microsoft (R) TTDInject 1.01.11
Release: 1.11.27.0
Copyright (C) Microsoft Corporation. All rights reserved.
TTDLoader Params:
LauncherDll = TTDLoader
ClientDll = TTDRecordCPU
ClientEntry = InitializeNirvanaClient
ClientParams= 37 C:\TTD\Notepad03.run 0 0 0 0 0 0 0 0 c06001 0
Attach
WaitForMain is off
Allocated processors:55, running threads:2.
Loader TTDLoader.dll injected at 0x00007FFF423B0000 0xc000 -- .reload TTDLoader.dll=0x00007FFF423B0000,0xc000
Injection by thread is complete.
RecordingEngine initialization successful.
RecordVcpu initialization successful.
Loader initialization successful.
Guest Process is x64 binary.
Tracing started at: Tue May 9 00:07:16 2023 (UTC) Mon May 8 17:07:16 2023 (Local)
Guest process exited with exit code 0
Simulation time of '' (x64): 18781ms.
Tracing completed at: Tue May 9 00:07:34 2023 (UTC) Mon May 8 17:07:34 2023 (Local)
大部分的 .out 檔案內容是內部使用,由時光旅行除錯小組用來解決錄製錯誤。 下面的資訊可能對其他正在使用追蹤檔案的人有幫助。
- 某些錯誤訊息只會顯示在 .out 檔案中,並可能協助您判斷失敗的具體情況。
- 記錄開始和停止的掛鐘時間指示
- 錄製工作階段持續多久(模擬時間)
- 錄製是以命令行啟動錄製還是附加錄製。
- OS 版本
相關內容
- 開始使用: 時間旅行偵錯 - 概觀 - 瞭解 TTD 的基本概念。
- 使用 WinDbg 進行記錄: 時間旅行偵錯 - 記錄追蹤 - 使用 WinDbg UI 來記錄追蹤。
- 分析追蹤: 時間旅行偵錯 - 重新執行追蹤 - 偵錯 WinDbg 中記錄的追蹤。
- 疑難排解: 時光旅行調試 - 疑難排解 - 解決常見的記錄問題。