本主题提供有关时间旅行调试中的新增功能的信息。
1.11.553
!tt 无参数使用时,现在显示简短的帮助文本和当前追踪位置,而不是移动到追踪的开头。
使用新的数据模型方法可以查看局部变量值的历史记录。 在 Frame 对象(如当前帧的 @$curframe)中,可以使用 。TTD。VariableHistory() 获取写入变量的值的日志,以及变量持有该值的位置范围。
-
dx -g @$curframe.TTD.VariableHistory().Variables显示局部变量名称的列表。 -
dx -g @$curframe.TTD.VariableHistory().Variables[n].Values显示局部变量 #n 的历史记录。
试验 SDK 中也提供了 TTD 重播 API。 此 API 与调试器用于与 TTD 交互的 API 相同,并且也是 .Calls() / .Memory() 能够高效收集数据的基础。 有关详细信息,请参阅 https://aka.ms/ttdsdk。
已修复
- 修复因弃用
ErrorReporting::PrintError导致的崩溃(1.11.553)
1.11.532
此版本是维护版本,可改进记录可靠性。 此 TTD 版本与 Windbg 的 2025 年 6 月版本相吻合。 一个新功能是位置数据模型对象现在将百分比报告到跟踪中。
已更改
- 其他基础结构维护。
- 使用 C++ volatile 的 ISO 标准实现。 (1.11.518)
- 向位置数据模型投影添加百分比。 (1.11.514)
已修复
- 提高 TTD 对解码指令的处理的可靠性。 (1.11.530)
- 删除模拟器中 XSAVE 的使用并优化内部寄存器传输。 (1.11.509)
1.11.506
此版本是一个小版本更新,与 WinDbg 的 2025 年 4 月版本同步发布。
已更改
单击数据模型中的 TTD 位置(例如,在“模块”列表中)导航到跟踪中的该位置。 (1.11.492)
注意:在执行下一步或运行命令之前,命令窗口不会显示更新的 TTD 位置。
已修复
- 附加到 PID 时,将进程名称添加到 .out 文件中,以方便故障排除。 (1.11.486)
1.11.481
我们对 “!tt” 命令进行了改进,为您提供了更强大的方式来浏览跟踪记录:
- 小数百分比可用于缩小搜索空间 (!tt 23.65)
- 查找上一次/下一次寄存器更改值的相关信息 (!tt br ebx)
- 查找上一次/下一次访问内存区间的相关信息 (!tt ba- [addr] [range])
- 查找上一次/下一次执行转移到其他模块的相关信息 (!tt bm)
- 查找上一次/下一次执行转移到特定模块的相关信息 (!tt bm ntdll)
有关详细信息,请参阅 !tt (时间旅行)。
一些值得注意的修复:
- 消息“错误:在 32 位跟踪上使用
@$cursession.TTD.Data.Heap()时,64 位值在转换为数字时丢失精度”已不再出现。 - 现在可以在命令行中的任何位置正确检测帮助选项解析 (
-?,-help)。 -
dx @$cursession.TTD.Calls()不再需要地址来匹配函数的开头。 而是将地址映射到最接近匹配函数的开头。 - TTD 能够通过 vertarget 命令正确报告目标操作系统版本。
- 使用“-monitor”指令与托管服务名称一起使用时,不会再记录无关的托管服务。
已添加
- 在 TTD 跟踪中注册更改断点 (1.11.431)
已更改
- 修复使用监控模式按名称记录服务的问题 (1.11.477)
- 捕获实际目标系统的 OS 信息以供调试器使用 (1.11.473)
- 修复模拟器和 CONTEXT 之间的 XMM 寄存器传输 (1.11.469)
- 允许针对函数内地址调用查询 (1.11.459)
- 支持在 !tt 命令行中使用符号表示地址/大小(1.11.454)
- 提高一致性并扩展 TTD 导航命令的功能(1.11.453)
- 在数据损坏的情况下提高模块 DB 一致性 (1.11.430)
已修复
- 在附加到 PID 时,将进程名称添加到输出中(1.11.486)
- TTD.Data.Heap() 报告“错误:64位值在转换为数字时丢失精度”在某些情况下(1.11.471)
- 提高记录启用了阴影堆栈的进程的可靠性(1.11.466)
- 通过 !tt bm 和数据模型添加模块导航 (1.11.462)
- 修复命令行分析的一些问题。 (1.11.444)
- 修复 lodsd,在地址处加载双字(将 rax 的上部清零)(1.11.434)
- 修复 libfuzzer 漏洞(1.11.433)
1.11.429
TTD 的此更新包含一些错误修复,以及一些内部更改,以提高可靠性。
注意:1.11.410 在 Intel/AMD LODSD 指令的仿真中引入了回归。 下一个版本中将修复此回归问题。
修复项:
- 提高数据包读取的可靠性和其他杂项更改,以提高可靠性。
- 修复模拟 AVX VBROADCAST[I/F]128 指令时的回归问题。
- 修复了在较新版本的 Windows 中 ARM64 上的异常记录访问。
1.11.410
改进了辅助功能:进度 UI 现在可以通过文本大小更改正确缩放。
调试器中的 @$cursession.TTD.Calls() 命令现在支持与大量函数匹配的通配符。
现在可以查询大量函数(@$cursession.TTD.Calls("kernel32!*"))。
自动化:新的 -onMonitorReadyEvent 命令行选项指示录制监视器(-monitor 开关)何时准备好录制新进程。
修复项:
- 在初始化录制器时修复某些争用情况。
- 修复记录 syscalls 以便断点正常工作的方式。
- 修复与模块选择性录制相关的多个问题。
ARM64 修复:
- 修复了阻止在普通 ARM64v8.0 级别 CPU 上记录 TTD 的 bug。
- 改进了尝试在 ARM64 上使用 x86 或 x64 进程跟踪时的消息传送。
AMD/Intel 修复(包括 Google 报告的一些问题):
- 修复了 LODS 的不正确仿真:之前是通过将未使用的 RAX 位清零,现在已正确地保留未使用的 RAX 位。
- 修复了 x86/x64 进程中“pop ax”指令的仿真,该指令错误地将完整寄存器的上位零(例如,“pop ax”清除了 rax 的上限位)。
- 直接模拟 XGETBV 指令(更快)。
- 直接模拟所有 AVX512 SIMD 移动(更快)。
1.11.316
修复了在使用不间断的数据密集型长指令序列录制程序时导致偶尔崩溃的回归。
ARM64 修复:
- 现在支持在启用了 PAC 功能的 ARM64 进程中进行录制。
- 修复了无法清除进位和溢出标志的 ANDS 和 TST 指令。
AMD/Intel 修复:
- 修复了 TTD 错误地将“xchg r8,rax”和“xchg r8w,ax”模拟为 NOP 的 bug。
1.11.304
TTD 现已实现并公开发布了一个 API,用于在实时记录过程中控制记录器。 文档和示例可在 GitHub 中找到。
现在,TTD 可以使用新的 -recordMode 开关在记录关闭的情况下自行注入。 默认情况下,TTD 使用 -recordMode Automatic,这会导致记录所有线程。 如果 -recordMode Manual 已指定,则 TTD 会注入目标进程,但直到通过 API 调用被告知要执行该作,否则不会记录任何内容。
现在,可以使用开关 -module 将记录限制为一组特定的模块。 在某些情况下,此限制可能会导致录制速度更快且跟踪文件更小。 可以指定多个 -module 开关。
发行版中现在包含了匹配的记录和重播组件。 如果调试器与命令行记录器不兼容,或者出现重播错误,可以作为一种变通方法将重播组件复制到调试器安装中,直到新的调试器发布。
可以通过运行以下命令在 PowerShell 中找到已安装的文件位置:
ls (Get-AppxPackage | where Name -eq 'Microsoft.TimeTravelDebugging').InstallLocation
已添加
- 添加了 - recordmode 开关,在不自动记录的情况下启用注入 (1.11.296)
- 添加了 - module 开关并用于创建 SR 配置 (1.11.291)
- 将进程内 API 记录的自定义数据投射到数据模型 (1.11.286)
- 添加了新的 TTDLiveRecorder.dll 并将其与 TTDRecordCPU.dll 连接起来 (1.11.283)
- 在 MSIX 中添加了重播组件,并修复了 SDK 查找 (1.11.265)
已更改
无
已修复
- 解决某些内部工具中使用的 nlohmann JSON 序列化程序中的错误 (1.11.281)
- 调整字符串对齐方式以避免出现罕见的 CRT 错误 (1.11.279)
- 已向 VS 和 OS 代码库报告并得到修复。
- 根据 Watson 崩溃报告进行了若干小修复 (1.11.276)
- 修复了在某些情况下可能导致跟踪文件损坏的回归问题 (1.11.264)
已知问题
- 在 ARM64 上,编译器无法结尾调用多个高频率函数,在极端情况下,这可能会导致记录器耗尽堆栈空间和崩溃。
1.11.261
此版本中的显著更改包括:
- [ARM64] 修复了当目标寄存器用作源寄存器时,
SXTL、SQXTN2、SQXTUN2、UQXTN2、XTN2和TRN1指令的行为。 - [ARM64] 修复了导致调试器显示SIMD寄存器的低64位复制到高64位的问题。
- [AMD64] AMD Zen4 处理器的 AVX512 仿真修复(寄存器损坏)。
已更改
- 为模拟器实现一个新的版本控制系统。 (1.11.260)
已修复
- 修复了目标寄存器也用作源寄存器的错误 ARM64 指令。 (1.11.261)
- 修复了直接返回模拟器的 Zen4 解决办法。 (1.11.222)
1.11.202
此版本修复了通过 -monitor 交换机录制服务或监视进程启动时遇到的多个问题。 还取消了产品对 ARM32 的记录支持。
已更改
- 将 TTD 组件作为 DLL 链接到 UCRT,从而减少二进制文件的大小。 (1.11.191)
已修复
- 修复了服务记录问题。 (1.11.193)
- 修复了使用 -monitor 时的几个问题。 (1.11.189)
- 修复了在 x64 上运行回退时保留非易失性的函数堆栈帧 (1.11.188)
- 重新启用了 TTD 输出缓冲 (1.11.187)
- 修复了 ProcessMonitorServer 中 GPO 句柄的处理问题 (1.11.179)
已删除
- 从存储库中移除了 ARM32 记录代码 (1.11.198)
1.11.173
此版本通过从 .out 文件中提取错误信息并将其打印到控制台,提高了某些错误信息的可见性。 它还修复了跟踪重播期间罕见的崩溃问题。
已更改
- 从 .out 文件中提取并打印错误信息 (1.11.173)
已修复
- 修复从单独的进程读取 .out 文件时的文件冲突。 (1.11.171)
- 修复了跟踪重播期间罕见的崩溃问题。 (1.11.166)
1.11.163
此版本新增了在 x64 机器上记录 x86 进程的支持。
已更改
- 修复了 x64 TTD 安装时的 x86 记录问题 (1.11.163)
已修复
- EULA 清理 (1.11.161)
1.11.159
此版本是命令行记录器的第一个公开版本。 除了为了将命令行记录器发布到公众而进行的多项更改外,此版本还包括多个漏洞修复,包括对 CPU 模拟器(CPU emulator)的几个修复。
新 -timestampFileName 开关可基于时间戳生成 .run 文件。 在录制同一进程的多个实例时,此开关非常有用,并且可以最大程度地减少录制启动时间。
已更改
- 根据使用的跟踪器在运行时选择默认注入模式 (1.11.156)
- 添加了开关以启用基于时间戳的 .run 文件生成 (1.11.155)
- 添加了 EULA 和
-accepteulaTTD (1.11.154) - 将 ProcLaunchMon.sys 添加到 MSIX (1.11.153)
- 创建了每个存档的 MSIX 和 MSIXBUNDLE (1.11.152)
- 修复了使用 Clang 测试 TTD 时出现的多个问题。 (1.11.146)
- TTDAnalyze 的 Clang 修复 (1.11.144)
已修复
- 审查关于应用程序安装程序/公开发布的反馈意见 (1.11.159)
- RC 反馈 (1.11.157)
- 通过将 RegisterInfo 初始化为指向接收器来避免零寄存器的损坏。 (1.11.149)
- 通过立即修复 TST 指令,并增强单元测试以涵盖更多内容。 (1.11.148)
- 合并受保护的进程决策并禁用受保护的进程使用 (1.11.147)
1.11.138
已更改
- 创建记录器 MSIX (1.11.138)
- 修复了所有问题,使 Clang 可以构建 TTD。 (1.11.137)
- 引入 -monitor X,记录进程启动时的情况 (1.11.116)
已修复
- 修复了“CMP ZR”ARM64 仿真问题 (1.11.128)
- 修复了 AMD Zen4 处理器上的 AVX512 仿真问题 (1.11.127)
- 修复了 TTD 用于查找特定 CPU 文件的机制 (1.11.121)
- 修复了 x86 TTD 回归问题(TTDRecordCPU.dll 无法加载) (1.11.110)
- 修复了 ARM64 上的返回本机路径问题,使其不会破坏 X28 (1.11.109)