按时间顺序调试 - TTD.exe 命令行实用工具

具有时钟的按时间顺序调试徽标。

本文介绍何时以及如何使用 TTD.exe 命令行实用工具记录跟踪。

何时使用 TTD.exe 命令行实用工具

通过时间旅行调试 (TTD) ,可以记录应用或进程的代码执行并将其保存在跟踪文件中。 可以在 Windows 调试器中播放该文件,以查找代码执行的问题。

在许多情况下,使用 TTD 记录应用或进程的最简单方法是直接从 WinDbg UI。 有关使用 WinDbg UI 进行按时间顺序调试的信息,请参阅 按时间顺序调试 - 概述

你可能会遇到只需要 TTD 命令行记录器的情况:在电脑上录制而无需安装调试器、高级录制方案、测试自动化等。在这些方案中,可以通过 URL 仅安装 TTD 命令行记录器。

TTD 录制会影响录制的进程

TTD 录制是一种侵入性技术。 在录制时,你将注意到正在运行的应用或进程速度在 5 倍到 20 倍或更多时的速度变慢,具体取决于应用程序和所选的录制选项。

创建的跟踪文件会随着时间的推移而增长,并可能占用大量存储空间。 在最短时间内进行跟踪,捕获感兴趣的程序活动,然后尽快关闭跟踪。

将 TTD 附加到进程后,无法将其从中删除。 TTD 录制完成后,关闭应用或结束进程。 对于系统关键型进程,这需要重新启动 OS。

TTD 记录捕获内存内容,并可能包含个人身份或安全相关信息,包括但不一定仅限于文件路径、注册表、内存或文件内容。 确切信息取决于记录时的目标进程活动。

如何下载并安装 TTD.exe 命令行实用工具 (首选方法)

在此处下载 TTD 命令行实用工具 - https://aka.ms/ttd/download

选择“ 安装 ”,TTD 将下载并安装。 TTD 命令将添加到系统路径,并在安装完成后可在命令提示符下使用。

如果在安装时遇到问题,请参阅 排查应用安装程序文件的安装问题

在某些电脑上,可能需要安装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 命令行实用工具记录跟踪

有三种方法可以记录跟踪。

  • 启动进程
  • 附加到进程
  • 监视进程

记录进程后,需要触发要调试的问题。 你可能会打开有问题的文件或单击应用中的特定按钮,以引发感兴趣的事件。 当所记录的应用程序自然终止或崩溃时,跟踪文件将最终完成。

提示

记录 TTD 跟踪需要管理权限。 通常,这是通过从管理员命令提示符运行 ttd.exe 来完成的。

有关使用 WinDbg 记录时程跟踪的详细信息,请参阅 时间行程调试 - 记录跟踪

启动进程

-launch <Program> [<arguments>]

(默认模式) 启动和跟踪程序。

这是唯一允许将参数传递给程序的模式。 该计划将以与管理员) 相同的权限启动 TTD.exe (。 使用 -attach-monitor 以正常权限集记录程序。

包括 -launch 是可选的,但为了清楚起见,可以使用它。

不以 - 或 / 开头的第一个无法识别的参数将假定为启动的可执行路径,并且任何后续参数将假定为该程序的参数。

例如,使用 TTD.exe notepad.exe 启动和记录记事本。 关闭记事本时,跟踪将停止。

有关示例用法,请参阅 方案使用示例 - 记录进程

附加到进程

-attach <PID>

附加到由进程 ID 指定的正在运行的进程。 使用 TaskManager 或 TaskList 实用工具标识进程编号。 有关详细信息,请参阅 查找进程 ID

例如,使用 TTD.exe -attach 21440 -out C:\traces\MyTraceFile.run 启动和记录 ID 为 21440 的进程,并将跟踪保存在 MyTraceFile.run 中。

在运行 TTD.exe C:\traces 之前,请确保本示例中 () 目录存在。

有关示例用法,请参阅 方案 - 定位并附加到正在运行的进程

监视进程

-monitor <Program>

监视器选项允许在每次启动时监视和跟踪程序。 若要使用此选项,必须使用 指定输出位置 -out的完整路径。

若要停止监视,请按 Ctrl+C。

与其他方法相比,监视main优势包括:

  • 可以正常启动目标应用,无需确定命令行即可启动它。
  • 目标应用将使用其正常权限运行。 如果直接从 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 指定的正在运行的进程。 使用 TaskManager 或 TaskList 实用工具标识进程 ID。 有关详细信息,请参阅 查找进程 ID

-monitor <Program>

每次启动程序或服务时跟踪它们 (,直到) 重新启动。 若要使用此选项,必须使用 指定输出位置 -out的完整路径。

基本命令行选项

-out <path>

指定跟踪文件名或目录。 如果为目录,则目录必须已存在。 如果文件名为 ,则文件名不得存在。

-noUI

禁用 UI 以手动控制录制。

如果未选择此选项,则会在录制处于活动状态时显示一个小 UI。 “跟踪关闭”停止跟踪,应用继续;“退出应用”将关闭也会停止跟踪的应用。

显示跟踪状态和退出应用按钮的小两个按钮 TTD UI 的屏幕截图。

-accepteula

使用此选项接受 EULA 用户许可协议。 在查看并接受 EULA 后,可以在自动化方案中使用此选项。

TTD 在首次运行时显示 EULA。 键入 Y 或 N 接受 EULA。 接受后,ELA 在启动时将不再显示。 如果不接受 EULA TTD 退出,并且将显示 EULA,则下次运行 TTD 时。

跟踪控件

-stop <process name> | <PID> | all

停止跟踪指定的进程名称,可以指定 PID 或“all”。

-wait <timeout>

等待为系统上的所有跟踪会话指定的最多秒数结束。 指定 -1 无限期等待。

-tracingOff

在关闭跟踪记录的情况下启动应用程序。 可以使用 UI 复选框在关闭跟踪后将其重新打开。

其他命令行选项

-children

记录目标以及目标创建的任何进程。 每个子进程将记录到其自己的跟踪文件中。

-cmdLineFilter "<string>"

如果目标的命令行包含字符串,请记录该目标。 此选项仅适用于 -monitor 模式。 当命令行参数唯一标识你感兴趣的进程时,它非常有用。 例如, -monitor notepad.exe -cmdLineFilter "specialfile.txt" 仅当 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 为单位)。 在完整跟踪模式下,默认值为 1024GB,最小值为 1MB。 在环形缓冲区模式下,默认值为 2048MB,最小值为 1MB,最大值为 32768MB。

32 位进程上内存中环的默认值为 256MB。

-maxConcurrentRecordings <count>

在任何一个时间点可以进行的最大录制数。 如果未指定,可以同时进行无限数量的录制。

-numVCpu <number>

指定要在跟踪时保留和使用的数量虚拟 CPU。 此值会影响 TTD 放置在来宾进程内存上的总内存开销。 如果未指定,则每个平台的默认值为:55(对于 x64/ARM64)和 32(对于 x86)。

更改此设置,以便 仅在 内存不足时限制内存影响。 将 numVCpu 值更改为较小的数字可能会严重影响跟踪的性能,只应解决内存使用问题。

如果 TTD.exe 无法录制,或者 .out 文件指示模拟为 0 秒,则使用 -numVCpu 可能会使录制成功。

-replayCpuSupport <support>

指定将用于重播跟踪的 CPU 的预期支持。 建议使用默认设置,以便在计算机之间移植跟踪,但其他选项可用于生成小型跟踪文件并记录更快的 (具体取决于目标程序) 使用的特定说明。

<support>

说明
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 应用

在此方案中,将启动记事本并创建跟踪。

  1. -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
  1. 将显示一个小应用程序菜单,显示跟踪已打开。

显示跟踪状态和退出应用按钮的 TTD UI 的屏幕截图。

  1. 关闭应用程序时,将生成跟踪文件。 在此示例中,notepad01.run。

方案 - 使用传递的参数启动和记录 Windows 应用

在此方案中,将启动 ping,并将要 ping 的地址作为参数传入。

  1. 在此示例中, -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
  1. 关闭应用程序时,将生成跟踪文件。 在此示例中,ping01.run。

方案 - 查找并附加到正在运行的进程

在此方案中,将启动记事本,找到其进程 ID,并通过附加到正在运行的应用程序创建跟踪

  1. 在此示例记事本中启动目标应用。

  2. 使用 TaskList 或中所述的其他方法查找进程 ID。 有关详细信息,请参阅 查找进程 ID

C:\TTD> TaskList
...
Notepad.exe                  21440 Console                    1     73,020 K
...
  1. 使用该进程 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

场景 - 记录父进程及其子进程

在此方案中,将记录父进程及其子进程。 由于某些应用可能使用许多子进程,因此包含子级的家庭跟踪文件可能会变得非常大。

  1. 指定要 -children 记录的父应用的选项和名称。

这是一个将 cmd.exe 启动 ping.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

...

  1. 创建多个跟踪文件:一个用于父进程,一个跟踪文件用于每个子进程。 WinDbg 一次只打开一个跟踪文件,因此,如果要同时调试 WinDbg,则需要为每个跟踪运行单独的 WinDbg 实例。

方案使用示例 - 监视过程

方案 - 监视程序启动和开始录制

在此方案中, -monitor 选项用于记录所有当前正在运行的实例以及 notepad.exe 的未来实例,直到系统重新启动或通过 Ctrl+C 退出 ttd.exe 为止。 监视器 -out 需要 选项,并且输出文件夹必须已存在。

  1. 监视和跟踪当前以及 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

  1. 在此示例中,在开始跟踪后加载了两个 notepad.exe 实例。 捕获感兴趣的活动后,在命令提示符处使用 Ctrl-C 来停止录制。

方案 - 监视程序启动的两个程序

在此方案中, -monitor 选项用于监视和记录两个应用程序。

  1. 监视和跟踪当前以及 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
  1. 在此示例中,notepad.exe,然后在跟踪开始后加载 ping.exe。 捕获感兴趣的活动后,在命令提示符处使用 Ctrl-C 来停止录制。

场景 - 在第二个窗口中停止录制

在此方案中,捕获了感兴趣的活动,并且使用 -stop all停止所有录制。 第二个命令窗口用于执行 -stop all 选项。

C:\TTD> TTD.exe -stop all
Microsoft (R) TTD 1.01.11
Release: 1.11.121.0
Copyright (C) Microsoft Corporation. All rights reserved.

Full trace written to 'C:\TTD\Notepad01.run'

方案 - 清理监视器驱动程序

在此方案中, -cleanup 选项用于在完成所有记录后清理监视器驱动程序。

C:\TTD> TTD.exe -cleanup
The monitor service is not installed
Successfully uninstalled the Process Launch Monitor driver

其他命令行示例

此表突出显示了一些其他命令行用法示例。 有关图示 选项 的其他信息,请参阅命令行选项。

方案 命令 说明
附加到进程,但尚未开始录制 Ttd.exe -tracingoff notepad.exe 启动记事本,但已关闭录制。 可以随时通过 UI 启动录制。
按命令行筛选 Ttd.exe -cmdlinefilter foo.txt -monitor notepad.exe 记录 notepad.exe,但前提是 foo.txt 在启动时在命令行上,将输出放置在当前目录中。
响铃录制 Ttd.exe -ring -attach 1234 将 PID 1234 记录到限制为 2GB 的跟踪文件中,并将输出放置在当前目录中。 跟踪文件中的较旧内容会根据需要覆盖,以将文件保持在最大大小之下。

使用 -maxfile 更改最大大小。
限制跟踪文件大小 Ttd.exe -maxfile 4096 notepad.exe 记录 notepad.exe,直到跟踪文件达到 4GB,并将输出放置在当前目录中。
限制同时发生的录制数 Ttd.exe -maxconcurrentrecordings 1 -out c:\my\dir -monitor notepad.exe 录制会占用大量 CPU,在某些情况下。
减少目标进程中的内存使用量 Ttd.exe -numvcpu 8 -monitor w3wp.exe 某些进程(例如 w3wp.exe)在可以使用的内存量上设置少量配额。 如果 ttd.exe 无法开始录制,请使用 -numvcpu 来减少虚拟 CPU TTD 分配的数量。 仅当 ttd.exe 无法通过其他方式进行录制时,才尝试此选项。
在跟踪可移植性和记录速度/跟踪文件大小之间进行选择 Ttd.exe -replaycpusupport mostaggressive notepad.exe 默认情况下,TTD 会生成可跨各种硬件移植的跟踪文件。 选择“mostaggressive”会告知 TTD 可以记录只能在具有与记录跟踪的计算机相同的功能的 CPU 上播放的跟踪。 在某些情况下,这可以大幅提高记录速度和跟踪文件大小。

自动化命令行示例

此表重点介绍了一些其他命令行用法示例,这些示例可用于自动使用 TTD.exe 实用工具。

方案 命令 说明
禁用 UI Ttd.exe -noui -accepteula notepad.exe 记录 notepad.exe,将输出放入当前目录,而不显示 UI。
等待录制器以编程方式启动 Ttd.exe -accepteula -oninitcompleteevent ttd_notepad notepad.exe 创建名为“ttd_notepad”的 Win32 事件并启动 notepad.exe。 初始化录制时,TTD 将发出“ttd_notepad”信号。 自动化可以在继续执行要记录的行为之前等待事件。
保留目标的退出代码 Ttd.exe -accepteula -passthroughexit ping.exe msn.com 记录 ping.exe,将输出放置在当前目录中。 Ttd.exe 的退出代码将与 ping.exe 的退出代码相同。
等待录制结束 Ttd.exe -accepteula -wait 30 停止录制后,等待最多 30 秒,TTD 完成将跟踪文件写入磁盘。 使用 -wait -1 无限期等待。

所有这些示例都使用 -accepteula 选项来确保 EULA 确认对话框不会阻止自动化。

使用生成的跟踪文件

有关使用跟踪的信息以及有关如何重播时间行程跟踪以及如何在时间上向前和向后导航的说明,请参阅 时间行程调试 - 重播跟踪

有关使用跟踪文件的提示

  • 与他人共享跟踪时,只需共享 .run 文件。 索引文件 (.idx) 可以与 .run 文件一样大,并在 WinDbg 加载跟踪文件时自动创建。
  • 与他人协作时,传递与手头问题相关的任何相关跟踪位置。 协作者可以使用 !tt x:y 命令在执行代码时移动到该确切的时间点。 时间位置范围可以包含在 bug 说明中,以跟踪可能发生问题的位置。
  • 报告 TTD 问题时,如果提供 .run 文件,请同时提供 .out 文件。 这样就可以确认录制过程是否正常工作。
  • 跟踪文件 (.run) 压缩良好。

排查 TTD.exe 问题

在某些情况下,可能会出现跟踪文件错误。 有关详细信息,请参阅 按时间顺序调试 - 故障排除

.out 文件可用于故障排除。 示例 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 版本

另请参阅

时光穿越调试 - 概述

时间旅行调试 - 记录跟踪

时光穿越调试 - 重放跟踪