概述:Windows 时间旅行调试(TTD)技术指南,支持反溯和记录回放调试。

本文部分内容由 AI 生成,经人工修订。

0x01、TTD 概述

TTD (Time Travel Debugging) 是 WinDbg 的一个功能,可以记录进程执行过程并支持反向调试,即”时间旅行” - 可以回退到之前的任意时间点。

TTD 优势

优势说明
反向调试可以回退执行,回到之前的任意位置
历史记录完整记录进程的所有执行历史
定位问题快速定位难以重现的 bug
事件追溯追踪特定事件的发生过程

系统要求

  • Windows 10 或更高版本
  • WinDbg Preview (支持 TTD)
  • 目标架构:x64 (原生支持),x86 (有限支持)

0x02、启动 TTD 调试

方法一:通过 WinDbg Preview

  1. 打开 WinDbg Preview
  2. 选择 “File” → “Launch Executable”
  3. 勾选 “Time Travel Debugging”
  4. 执行目标程序

方法二:通过命令行

# 启动程序并记录
windbgx -tt "C:\path\to\program.exe"
 
# 记录指定时间(秒)
windbgx -ttd:3600 "C:\path\to\program.exe"

方法三:附加到运行中的进程

  1. WinDbg 中选择 “File” → “Attach to Process”
  2. 选择进程
  3. 设置断点
  4. 当命中断点时,开始记录

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 mytrace

0x04、常用调试场景

场景 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

优化建议

  1. 限制记录时间范围
  2. 只记录关键路径
  3. 使用过滤器减少记录量

0x08、相关链接

相关文章


更新时间: 2026-03-27