什么是时间旅行调试?
时间旅行调试(TTD)是一种工具,可在进程执行时捕获过程的跟踪记录,并在以后向前和向后方向重播。 TTD 通过让调试器会话回溯来帮助你解决调试问题,免去了一次次重现问题直到找到错误的麻烦。
TTD 允许你及时返回,以便更好地了解导致 bug 的条件,并多次重播它,以了解如何最好地解决问题。
TTD 相较于故障转储文件具有优势,后者常常遗漏了导致最终失败的状态和执行路径。
如果自己无法解决问题,可以与同事共享跟踪记录,以便他们可以准确查看您查看的内容。 此功能使协作比实时调试更容易,因为记录的说明相同,而地址位置和代码执行在不同的电脑上有所不同。 还可以共享特定时间点,以帮助同事找出开始位置。
TTD 非常高效,能够尽可能减少开销,因为它在跟踪文件中捕获代码执行。
TTD 包括一组调试器数据模型对象,可用于使用 LINQ 查询跟踪。 例如,可以使用 TTD 对象查找加载特定代码模块或查找所有异常时。
要求
时间旅行调试与 WinDbg 集成,提供无缝录制和重播体验。
若要使用 TTD,需要使用提升的权限运行调试器。 使用具有管理员权限的帐户安装 WinDbg,并在调试器中录制时使用该帐户。 若要使用提升的权限运行调试器,请在“开始”菜单中选择并按住 WinDbg 图标,然后选择“以管理员身份运行更多>”。
发行说明
TTD 继续发展。 有关最新信息,请参阅 时间旅行调试发行说明。
录制可能包含个人身份或安全相关信息
创建包含录制的跟踪文件可能包含个人身份或安全相关信息,包括但不限于文件路径、注册表、内存或文件内容。 确切信息取决于记录目标进程活动。 在与其他人共享录制文件时,请注意这一点。
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 不会为跟踪文件设置最大大小,以允许复杂的长时间运行方案。 快速重现问题使跟踪文件的大小尽可能小。
跟踪和索引文件
跟踪文件 (.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 冲突的环境的另一个示例是 Electron 应用程序框架。 在这种情况下,跟踪可能会被记录,但也可能发生记录进程的死锁或崩溃。
仅限用户模式
TTD 目前仅支持用户模式作,因此无法跟踪内核模式进程。
只读播放
你可以及时返回,但无法更改历史记录。 可以使用读取内存命令,但不能使用修改或写入内存的命令。
受系统保护的进程
某些受 Windows 系统保护的进程(如受保护的进程灯(PPL)进程受到保护。 TTD 无法注入到受保护的进程中来记录代码执行。
录制的性能影响
录制应用程序或进程会影响电脑的性能。 实际性能开销因录制期间执行的代码量和类型而异。 在典型的录制方案中,预计性能达到 10x-20 倍左右。 有时 UI 中没有明显的减速。 但是,对于资源密集型作(如“文件打开”对话框),可以看到录制的影响。
跟踪文件错误
可能会发生跟踪文件错误。 有关详细信息,请参阅 时间旅行调试 - 故障排除。
时间旅行调试的高级功能
时间线
时间线是执行过程中发生的事件的可视化表示。 这些事件的位置包括:断点、内存读取/写入、函数调用和返回以及异常。 有关时间线的详细信息,请参阅 WinDbg - 时间线。
调试器数据模型支持
-
内置数据模型支持 - TTD 包括数据模型支持。 使用 LINQ 查询分析应用程序故障可能是一种功能强大的工具。 可以使用 WinDbg 中的数据模型窗口处理可扩展且可浏览的版本
dxdx -g,并允许您使用 NatVis、JavaScript 和 LINQ 查询创建表。
有关调试器数据模型的常规信息,请参阅 WinDbg - 数据模型。 有关使用 TTD 调试器对象模型的信息,请参阅 时间旅行调试 - 时间旅行调试对象简介。
脚本支持
- 脚本自动化 - 对 JavaScript 和 NatVis 的脚本支持允许自动执行问题调查。 有关详细信息,请参阅 时间旅行调试 - JavaScript 自动化。
有关使用 JavaScript 和 NatVis 的一般信息,请参阅 WinDbg - 脚本。
TTD.exe命令行实用工具
TTD.exe用于记录跟踪的命令行实用工具可用。 有关详细信息,请参阅 时间旅行调试 - TTD.exe命令行实用工具。
托管代码 TTD 支持
可以使用 64 位模式下运行的 SOS 调试扩展(sos.dll)在 WinDbg 中使用 TTD 调试托管代码。 有关详细信息,请参阅 使用 Windows 调试器调试托管代码。
TTD 入门
从此处开始
如果你不熟悉 TTD,请遵循以下学习路径:
需要帮助?
高级功能
- TTD 调试器对象 - 使用 LINQ 查询跟踪记录
- JavaScript 自动化 - 自动执行问题调查