概述:Windows 时间旅行调试(TTD)技术指南,支持反溯和记录回放调试。
0x01、TTD 概述
TTD (Time Travel Debugging) 是 WinDbg 的一个功能,可以记录进程执行过程并支持反向调试,即”时间旅行” - 可以回退到之前的任意时间点。
TTD 优势
| 优势 | 说明 |
|---|---|
| 反向调试 | 可以回退执行,回到之前的任意位置 |
| 历史记录 | 完整记录进程的所有执行历史 |
| 定位问题 | 快速定位难以重现的 bug |
| 事件追溯 | 追踪特定事件的发生过程 |
系统要求
- Windows 10 或更高版本
- WinDbg Preview (支持 TTD)
- 目标架构:x64 (原生支持),x86 (有限支持)
0x02、启动 TTD 调试
方法一:通过 WinDbg Preview
- 打开 WinDbg Preview
- 选择 “File” → “Launch Executable”
- 勾选 “Time Travel Debugging”
- 执行目标程序
方法二:通过命令行
# 启动程序并记录
windbgx -tt "C:\path\to\program.exe"
# 记录指定时间(秒)
windbgx -ttd:3600 "C:\path\to\program.exe"方法三:附加到运行中的进程
- WinDbg 中选择 “File” → “Attach to Process”
- 选择进程
- 设置断点
- 当命中断点时,开始记录
0x03、TTD 基础命令
时间旅行命令
# 返回上一个事件
g-
# 前进到下一个事件
g+
# 跳转到特定位置
g @#<position>
# 查看当前位置的详细信息
g @#?查询命令
# 列出所有函数调用
dx -g @$cursession.TTD.Calls("module!function")
# 查看函数返回值
dx @$cursession.TTD.Calls("module!function").Where(x => x.ReturnValue != 0)
# 查看内存访问记录
dx -g @$cursession.TTD.MemoryAccess("address")
# 查看所有异常
dx -g @$cursession.TTD.Exceptions()时间线命令
# 显示时间线
tt
# 显示位置信息
p @$curip
# 显示当前位置的事件流
ttdext.trace mytrace0x04、常用调试场景
场景 1:定位内存损坏
# 记录执行并检测内存损坏
windbgx -tt "program.exe"
# 当发生异常时,回退查找
g-
# 查看导致异常的内存写入
dx -g @$cursession.TTD.MemoryAccess.Where(x => x.AccessType == "Write")场景 2:逆向分析函数调用
# 列出目标函数的所有调用
dx -g @$cursession.TTD.Calls("targetdll!TargetFunction")
# 查看每个调用的详细信息
dx @$cursession.TTD.Calls("targetdll!TargetFunction").Dump()
# 追踪特定调用序列
dx -g @$cursession.TTD.Calls("targetdll!TargetFunction").Last().Time场景 3:分析多线程竞争
# 查看线程切换点
dx -g @$cursession.TTD.Calls("Kernel32!SwitchToThread")
# 分析特定线程的执行历史
dx @$cursession.TTD.Threads().Where(x => x.ThreadId == 1234)
# 回退到线程切换点
g @#<thread-switch-position>0x05、TTD 高级功能
符号化和执行
# 在 TTD 记录上执行命令
g @#0;!for_each_frame .frame
# 在每个函数入口设置检查点
bp module!function ".if (poi(@ecx) == 0) { j @$curip != @#0 { g @#0; gc } }"时间线查询
# 查找特定时间点的调用
dx @$cursession.TTD.Calls.Where(x => x.Time < TimeSpan.FromSeconds(100))
# 查找包含特定模式的函数
dx -g @$cursession.TTD.Calls().Where(x => x.Function.Contains("string"))0x06、TTD 脚本自动化
TTD-bindings 使用
TTD-bindings 是 TTD 的 Python 绑定库,支持脚本化分析。
from ttd import *
# 打开 TTD 记录
session = Session.open("trace.run")
# 查找所有函数调用
for call in session.calls():
print(f"{call.function} @ {call.time}")
# 分析特定函数
target_calls = session.calls("targetdll!TargetFunction")
for call in target_calls:
print(f"Called at {call.time}, returned {call.return_value}")0x07、性能考虑
记录开销
| 操作 | 开销 |
|---|---|
| 执行记录 | 约 2-5x 慢 |
| 记录文件 | 约 1-2GB/分钟 (典型应用) |
| 内存使用 | 约 100-500MB |
优化建议
- 限制记录时间范围
- 只记录关键路径
- 使用过滤器减少记录量
0x08、相关链接
相关文章
更新时间: 2026-03-27