时间旅行调试 - 故障排除
本部分介绍如何排查时间旅行跟踪问题。
尝试记录进程时出现问题
我收到一条错误消息,指出“必须运行 WinDbg 才能支持时间旅行调试”
如消息所示,运行提升的调试器是一项要求。 若要运行提升的调试器,请在“开始”菜单中右键单击 WinDbg 图标,然后选择“以管理员身份运行更多>”。
我使用没有管理员权限的帐户安装了 WinDbg,并收到一条错误消息,指出“必须运行 WinDbg 才能支持时间旅行调试”
使用具有管理员权限的帐户重新安装 WinDbg,并在调试器中录制时使用该帐户。
无法启动和记录 UWP 应用程序
目前不支持此功能,但你可以附加到并记录已运行的 UWP 应用程序。
无法记录异常的进程类型 - 在另一个会话、安全上下文、凭据中运行...
目前,TTD 仅记录正常从命令控制台启动的常规进程,或在 Windows 资源管理器中单击可执行文件或快捷方式。
无法在计算机上成功记录应用程序
如果应用程序录制失败,请验证是否可以记录简单的 Windows 进程。 例如,“ping.exe”或“cmd.exe”是通常可以记录的简单过程。
我无法成功记录计算机上的任何内容
TTD 录制是一种侵入性技术,它可以干扰其他侵入性技术,如应用程序虚拟化框架、信息管理产品、安全软件或防病毒软件。
有关已知 TTD 不兼容的信息,请参阅时间旅行调试中的 “注意事项” - 概述 。
我正在跟踪应用程序并同时运行 AppVerifier,重播跟踪时的性能很慢。
由于 AppVerifier 使用内存检查应用程序的方式,在稍后重播跟踪时的体验可能明显比没有 AppVerifier 更差。 若要提高性能,请在录制应用时禁用 AppVerifier。 如果无法执行此操作,可能需要关闭 WinDbg 中的调用堆栈窗口以提高性能。
的问题。IDX 索引文件
可以调试没有索引文件或索引文件损坏或不完整的索引文件的跟踪文件,但不建议这样做。 需要索引文件,以确保从调试的进程读取的内存值最准确,并提高所有其他调试操作的效率。
!index -status
使用命令检查该命令的状态。与 .. 关联的 IDX 索引文件运行跟踪文件。
如果尝试通过运行 !index -force
重新创建索引文件。
重新创建 .IDX 索引文件
如果怀疑索引文件并出现问题,或者 !index -status
显示“已加载索引文件”以外的任何内容,请重新创建它。
为此,可以运行 !index -force
。 如果失败:
- 关闭调试器。
- 删除现有 IDX 文件,其名称与 ..运行跟踪文件,并位于与 .. 相同的目录中。RUN 文件为<
- 打开跟踪。WinDbg 中的 RUN 文件。 这将运行
!index
命令以重新创建索引。 !index -status
使用命令确认跟踪索引正常运行。
确保跟踪文件所在的同一位置的索引文件有足够的空间。 根据录制的内容,索引文件可能明显大于跟踪文件,通常按大两倍的顺序。
跟踪问题。RUN 文件
当跟踪出现问题时。RUN 文件,可能会收到错误消息,例如这些错误消息。
Replay and log are out of sync at fallback data. Packet type is incorrect "Packet Type"
Replay and log are out of sync at opaque data. Log had already reached the end
Replay exit thread event does not match up with logged event
Logged debug write values are out of sync with replay
在大多数情况下,所有失败消息都表示 。RUN 跟踪文件不可用,必须重新记录。
重新录制用户模式应用
如果录制用户模式应用存在特定问题,可能需要尝试在同一台电脑上录制其他应用,或者尝试在不同的电脑上使用相同的应用。 你可能想要尝试记录应用的不同用法,以查看是否在录制应用的某些部分存在特定问题。
调试或创建索引时,我会看到有关“脱轨事件”的消息。
你可能会看到如下消息:
Derailment event MissingDataDerailment(7) on UTID 2, position 2A550B:108 with PC 0x7FFE5EEB4448 Request address: 0x600020, size: 32
TTD 的工作原理是运行调试器内部的仿真器,该模拟器执行调试进程的指令,以便复制记录中每个位置的进程的状态。 当此模拟器观察到在跟踪文件中找到的结果状态与信息之间存在某种差异时,会发生脱轨。 例如,上面引用的错误是指在跟踪中位于位置 2A550B:108 的位置0x7FFE5EEB4448找到的指令,该指令尝试读取记录中不存在的位置0x600020的一些内存。
脱轨通常是由记录器中的一些错误(有时在模拟器中)在跟踪中进一步记录的指令导致的。
在大多数情况下,此失败消息指示 。对于某些不确定的指令数,RUN 跟踪文件在线程中存在脱轨的间隙,从它脱轨的点开始。 如果尝试调试的事件在该间隙期间未发生,则跟踪可能可用。 如果在该间隙期间发生了感兴趣的事件,则需要重新记录跟踪。