时光穿越调试 - 概述

Time travel debugging logo featuring a clock.

什么是时间旅行调试?

时间旅行调试是一种工具,可用于捕获进程执行时的跟踪,然后在以后向前和向后重播进程。 时间旅行调试(TTD)通过让你“倒退”调试器会话来帮助你更轻松地调试问题,而无需重现问题,直到找到 bug。

TTD 允许你及时返回,以便更好地了解导致 bug 的条件,并多次重播它,以了解如何最好地解决问题。

TTD 可以比故障转储文件具有优势,这通常错过导致最终失败的状态和执行路径。

如果自己无法弄清楚问题,可以与同事共享跟踪,并且他们可以确切地查看所查看的内容。 这可以比实时调试更容易进行协作,因为记录的指令相同,而地址位置和代码执行在不同电脑上会有所不同。 还可以共享特定时间点,以帮助同事找出开始位置。

TTD 效率高,在捕获跟踪文件中的代码执行时,可以添加尽可能少的开销。

TTD 包括一组调试器数据模型对象,用于使用 LINQ 查询跟踪。 例如,可以使用 TTD 对象查找加载特定代码模块或查找所有异常时。

Screenshot of WinDbg with Time Travel Debugging command and three timelines.

要求

时间旅行调试与 WinDbg 集成,提供无缝录制和重播体验。

若要使用 TTD,需要运行提升的调试器。 使用具有管理员权限的帐户安装 WinDbg,并在调试器中录制时使用该帐户。 若要运行提升的调试器,请在开始菜单中选择并按住 WinDbg 图标,然后选择“更多>运行”作为管理员istrator。

创建包含录制的跟踪文件可能包含个人身份或安全相关信息,包括但不限于文件路径、注册表、内存或文件内容。 确切信息取决于记录目标进程活动。 在与其他人共享录制文件时,请注意这一点。

TTD.exe命令行录制实用工具

除了在 WinDbg UI 中记录跟踪之外,还有一个可用于记录跟踪的TTD.exe命令行实用工具。

在某些情况下,只有 TTD 命令行录制器是必需的:在电脑上录制,而无需安装调试器、高级录制方案、测试自动化等。在这些情况下,只需通过 URL 安装 TTD 命令行记录器即可。 有关详细信息,请参阅 时间旅行调试 - TTD.exe命令行实用工具

调试工具的比较

下表总结了可用的不同调试解决方案的优缺点。

方法 优点 缺点
实时调试 交互式体验,查看执行流,可以更改目标状态,熟悉的工具在熟悉的设置。 中断用户体验,可能需要努力重复重现问题,可能会影响安全性,而不是总是在生产系统上选择。 由于重现难以从故障点恢复,以确定原因。
转储 没有基于触发器的前期编码、低侵入性。 连续快照或实时转储提供简单的“随时间推移”视图。 如果未使用开销,则开销实质上为零。
遥测和日志 轻量级,通常绑定到业务方案/用户操作,机器学习友好。 意外的代码路径(没有遥测)中会出现问题。 缺少数据深度,静态编译到代码中。
时间旅行调试 (TTD) 非常擅长复杂的 bug,没有前期编码,脱机可重复调试,分析友好,捕获所有内容。 记录时的大型开销。 可能会收集所需的更多数据。 数据文件可能会变得很大。

视频培训

若要了解有关 TTD 的详细信息,请参阅这些视频。

碎片整理工具 185 - Ivette 和 JamesP 介绍 TTD 的基础知识,并演示 WinDbg 中的一些功能

碎片整理工具 186 - Jordi 和 JCAB 演示 WinDbg 中 TTD 的更多出色功能

CppCon (YouTube) - Jordi、Ken 和 JamesM 在 CppCon 2017 的 WinDbg 中展示了 TTD

跟踪文件基础知识

跟踪文件大小

跟踪文件可以变得很大,并且 TTD 的用户需要确保有足够的可用空间。 如果录制程序几分钟,跟踪文件可以快速增长到几千兆字节。 TTD 未设置最大跟踪文件大小,以允许复杂的长时间运行方案。 快速重新创建问题,将尽可能小地保留跟踪文件大小。

跟踪和索引文件

跟踪文件 (.run) 在录制过程中存储代码执行。

录制停止后,将创建索引文件(.idx)以优化对跟踪信息的访问。 当 WinDbg 打开跟踪文件时,也会自动创建索引文件。

索引文件也可以很大,通常比跟踪文件大两倍。

可以使用命令从跟踪文件重新创建索引文件 !tt.index

0:000> !tt.index
Successfully created the index in 10ms.

录制错误和其他录制输出将写入 WinDbg 日志文件。

所有输出文件都存储在用户配置的位置。 默认位置位于用户文档文件夹中。 例如,对于 User1,TTD 文件将存储在此处:

C:\Users\User1\Documents

有关处理跟踪文件的详细信息,请参阅 时间旅行调试 - 使用跟踪文件

需要注意的事项

防病毒不兼容

由于 TTD 如何挂接到进程来记录它们,因此可能会遇到不兼容的问题。 通常,防病毒或其他试图跟踪和隐藏系统内存调用的系统软件出现问题。 如果遇到录制问题(例如权限消息不足),请尝试暂时禁用任何防病毒软件。

尝试阻止内存访问的其他实用工具也可能有问题,例如 Microsoft 增强缓解体验工具包。

与 TTD 冲突的环境的另一个示例是电子应用程序框架。 在这种情况下,跟踪可能会记录,但也可以记录进程的死锁或崩溃。

仅限用户模式

TTD 目前仅支持用户模式操作,因此无法跟踪内核模式进程。

只读播放

你可以及时返回,但无法更改历史记录。 可以使用读取内存命令,但不能使用修改或写入内存的命令。

系统保护的进程

某些受 Windows 系统保护的进程(如受保护的进程灯(PPL)进程受到保护,因此 TTD 无法将自身注入受保护的进程,以允许记录代码执行。

录制的性能影响

录制应用程序或进程会影响电脑的性能。 实际性能开销因录制期间执行的代码量和类型而异。 在典型的录制方案中,预计性能达到 10x-20 倍左右。 有时不会有明显的减速,但对于更多的资源密集型操作(即文件打开对话框),可以看到录制的影响。

跟踪文件错误

在某些情况下,可能会发生跟踪文件错误。 有关详细信息,请参阅 时间旅行调试 - 故障排除

时间旅行调试的高级功能

下面是一些最引人注目的 TTD 高级功能。

时间线

时间线是执行期间发生的事件的可视表示形式。 这些事件可以是以下位置:断点、内存读取/写入、函数调用和返回以及异常。 有关时间线的详细信息,请参阅 WinDbg - 时间线

调试器数据模型支持

  • 内置数据模型支持 - TTD 包括数据模型支持。 使用 LINQ 查询分析应用程序故障可能是一种功能强大的工具。 可以使用 WinDbg 中的数据模型窗口处理可扩展且可浏览的“dx”和“dx -g”版本,使你能够使用 NatVis、JavaScript 和 LINQ 查询创建表。

有关调试器数据模型的常规信息,请参阅 WinDbg - 数据模型。 有关使用 TTD 调试器对象模型的信息,请参阅 时间旅行调试 - 时间旅行调试对象简介。

脚本支持

有关使用 JavaScript 和 NatVis 的一般信息,请参阅 WinDbg - 脚本

TTD.exe命令行实用工具

TTD.exe用于记录跟踪的命令行实用工具可用。 有关详细信息,请参阅 时间旅行调试 - TTD.exe命令行实用工具

托管代码 TTD 支持

可以使用在 64 位模式下运行的 SOS 调试扩展(sos.dll)在 WinDbg 中使用 TTD 调试托管代码。 有关详细信息,请参阅 使用 Windows 调试器调试托管代码。

TTD 入门

查看这些主题以记录和重播跟踪文件,以及有关使用跟踪文件和故障排除的信息。

这些主题介绍在时间旅行调试方面的其他高级功能。