时光穿越调试 - 故障排除
本部分介绍如何对时间行程跟踪进行故障排除。
尝试录制进程时出现问题
我收到一条错误消息,指出“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 中运行文件。 这将运行
!index
命令以重新创建索引。 !index -status
使用 命令确认跟踪索引正常运行。
确保跟踪文件所在的同一位置有足够的空间用于索引文件。 根据记录的内容,索引文件可能明显大于跟踪文件,通常为两倍大。
跟踪 的问题。运行文件
当跟踪 出现问题时。运行 文件,可能会收到类似这些的错误消息。
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 的工作原理是在调试器内部运行仿真器,该模拟器执行调试进程的指令,以便在录制的每个位置复制该进程的状态。 当此模拟器观察到结果状态与跟踪文件中的信息之间存在某种差异时,会发生脱轨。 例如,上面带引号的错误是指在跟踪中位置0x7FFE5EEB4448 2A550B:108 的位置上找到的指令,该指令尝试读取记录中不存在的位置0x600020周围的一些内存。
脱轨通常是由记录器中的某些错误引起的,有时在模拟器中,在跟踪中进一步记录的指令。
在大多数情况下,此失败消息指示 。运行跟踪文件在出轨的线程中将有一个间隔,从它脱轨的点开始,对于一些不确定数量的指令。 如果尝试调试的感兴趣事件在该间隔期间未发生,则跟踪可能可用。 如果相关的事件在该间隔期间发生,则需要重新记录跟踪。