不支持。WinDbg Preview 无内置时间旅行调试(TTD)功能,仅通过手动录制并加载 tttracer.exe 生成的 .run 轨迹文件启用 TTD 模式,且需严格满足路径、符号、环境等条件才能正常使用。

WinDbg Preview 支持时间旅行调试吗?
不支持。WinDbg Preview 本身 没有内置时间旅行调试(Time-Travel Debugging, TTD)功能,它只是微软推出的现代化 UI 调试器前端,底层仍依赖 Windows 调试引擎(dbgeng.dll)。真正的 TTD 功能由 tttracer.exe 和 ttdebugger.exe 提供,且仅集成在 WinDbg Preview 的“TTD 模式”中——但这不是默认启用的,必须手动录制并加载轨迹文件,不是实时调试原生进程。
如何启动 TTD 录制并用 WinDbg Preview 打开?
你需要先用命令行工具捕获执行轨迹,再在 WinDbg Preview 中加载该轨迹文件。这个过程分两步,缺一不可:
-
tttracer.exe必须从 Windows SDK 或 Windows Driver Kit (WDK) 安装获取,路径通常为C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\tttracer.exe - 录制时需指定目标程序完整路径,不能是相对路径或仅传 exe 名;工作目录会影响子进程加载行为
- 录制生成的
.run文件体积极大(GB 级),建议放在 SSD 上,且录制期间禁止休眠或锁屏 - WinDbg Preview 加载后,界面左上角会显示
TTD: running或TTD: paused,此时才能使用dx、!ttd等指令回溯
tttracer.exe -tracePath C:\temp\myapp.run -- C:\myproj\Debug\myapp.exe
为什么 WinDbg Preview 加载 .run 文件后无法单步或断点失效?
这是常见误操作导致的:TTD 不是传统调试模式,所有“运行”动作实际是重放已录制的确定性轨迹。你不能像 attach 进程那样动态加断点,必须在重放过程中用 bp 设置回放时生效的断点,且只对轨迹中真实发生的指令有效。
- 断点地址必须来自轨迹中的模块基址(可用
lm查看重放时的start列) -
g是“继续重放到下一个断点”,u只能反汇编当前重放位置,不能跳转到任意地址 -
!ttd命令族(如!ttd.time、!ttd.log)仅在 TTD 模式下可用,普通附加模式下会报错"Unknown command" - 若源码路径与录制时不一致,
dx @$curstack可能显示,需用.srcpath手动指定
哪些 C++ 场景适合用 TTD?哪些反而更麻烦?
TTD 最适合复现**非随机、非外部依赖、可稳定触发**的 bug,比如崩溃前的变量渐变、条件竞争中的特定执行序。但它对以下情况基本无效:
立即学习“C++免费学习笔记(深入)”;
- 涉及
std::random_device、QueryPerformanceCounter、网络 I/O、GUI 消息循环等不确定行为的程序 - 多进程协作场景(如主进程 fork 子进程),除非你用
tttracer -child显式追踪全部 - Release 版本无调试符号时,
dx表达式求值能力大幅下降,甚至无法展开std::vector - 录制时未开启
/DEBUG:FULL链接选项,会导致 PDB 信息缺失,源码映射失败
真正难的不是操作步骤,而是判断“这个 bug 是否真的能被 TTD 捕获”——很多开发者花半小时录完发现轨迹里根本没走到崩溃点,因为触发条件在录制环境里压根没满足。











