时间旅行调试 - TTD.exe命令行实用工具

带有时钟的时间旅行调试徽标。

本文介绍如何使用TTD.exe命令行实用工具记录跟踪的时间和方法。

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

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

对于许多方案,使用 TTD 记录应用或进程的最简单方法是直接从 WinDbg UI。 有关使用 WinDbg UI 进行时间旅行调试的信息,请参阅 时间旅行调试 - 概述

在某些情况下,只有 TTD 命令行录制器是必需的:在电脑上录制,而无需安装调试器、高级录制方案、测试自动化等。在这些情况下,只需通过 URL 安装 TTD 命令行记录器即可。

TTD 录制会影响录制的进程

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

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

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

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

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

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

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

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

在某些电脑上,可能需要安装适用于 Windows 10 的Microsoft 应用安装程序。 它在 Windows 中的 Microsoft 应用商店应用中可用。 从 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。

与其他方法相比,监视的主要优点是:

  • 你可以以正常方式启动目标应用,无需确定命令行即可启动它。
  • 目标应用将使用其正常权限运行。 如果直接从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 在来宾进程内存上放置的总内存开销。 如果未指定,则每个平台的默认值为:x64/ARM64 为 55,对于 x86 为 32。

更改此设置,以便仅当内存不足时限制内存影响。 将 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。 可以多次指定此选项来记录多个模块。

使用此选项时,目标进程以全速运行,直到执行指定模块(s)中的代码。 然后,TTD 将记录进程,直到执行离开指定的模块(s),此时录制处于关闭状态,目标将返回全速。 由于打开/关闭录制成本高昂,因此当指定模块调用过程中的其他模块时,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. 关闭应用程序后,将生成跟踪文件。 在此示例中,记事本01.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 实例。

方案使用示例 - 监视进程

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

在此方案中, -monitor 此选项用于记录所有当前正在运行的实例以及notepad.exe的未来实例,直到系统重新启动或ttd.exe通过 Ctrl+C 退出。 该 -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 命令移动到代码执行中的确切时间点。 时间位置范围可以包含在错误说明中,以跟踪可能出现问题的位置。
  • 报告 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 版本

另请参阅

时间旅行调试 - 概述

时间旅行调试 - 记录跟踪

时间旅行调试 - 重放跟踪