时间旅行调试 - 使用跟踪文件
本部分介绍如何处理时间旅行调试创建和使用的文件。
跟踪文件概述
时间旅行调试使用以下文件调试代码执行。
跟踪文件包含代码执行记录,并且有一个 .RUN 扩展。
索引文件允许快速访问跟踪文件中的信息,并具有一个 .IDX 扩展。
记录错误和其他记录输出会写入调试器日志文件。
跟踪 .RUN 文件
跟踪 .RUN 文件可在使用文件>开始调试>打开跟踪文件进行记录后被打开。
默认情况下,所有跟踪输出文件都存储在用户文档文件夹中。 例如,对于 User1,TTD 文件将存储在此处:
C:\Users\User1\Documents
可以在开始记录时更改跟踪文件的位置。 有关详细信息,请参阅时间旅行调试 - 记录。
最近使用的文件列表可方便快速访问以前使用的目标配置文件。 还会列出最近使用的任何跟踪文件或转储文件。
索引 .IDX 文件
在 WinDbg 中打开跟踪文件时,会自动为相关的跟踪 .RUN 文件创建索引 .IDX 文件。 可以使用 !index 命令手动创建索引文件。 通过索引可更快地访问跟踪信息。
IDX 文件也可能很大,通常为 .RUN 文件的两倍。
重新创建 .IDX 文件
可以使用 !index
命令从 .RUN 文件重新创建 .IDX 文件。 有关更多信息,请参阅时间旅行调试 -!index(时间旅行)。
0:0:001> !index
Indexed 3/3 keyframes
Successfully created the index in 49ms.
共享 TTD 跟踪 .RUN 文件
TTD 仅限本地,无法远程连接到另一台计算机。
TTD 跟踪文件 可以通过复制 .RUN 文件与他人共享。 这样将方便让同事帮忙找出问题。 它们不需要安装崩溃应用,也不需要执行任何其他相关的设置即可尝试重现问题。 他们只需加载跟踪文件并调试应用,就好像它已安装在电脑上。
重播 TTD 跟踪的计算机必须支持记录计算机上使用的所有指令,例如 AVX 指令。
可以重命名文件以包含任何附加信息,例如日期或错误编号。
这。IDX 文件不需要复制,因为可以使用上述 !index 命令重新创建 IDX 文件。
提示
与他人协作时,传递与当前问题相关的任何相关跟踪位置。 协作者可以使用 !tt x:y
命令移动到代码执行中的确切时间点。 时间位置范围可以包含在错误说明中,以跟踪可能出现问题的位置。
错误 - 日志文件
记录错误和其他记录输出会写入调试器日志文件。 要查看日志文件,请选择查看>日志。
本示例显示了尝试启动和记录不在 C:\Windows 目录中的名为 Foo.exe 的可执行文件时的错误日志文本。
2017-09-21:17:18:10:320 : Information : DbgXUI.dll : TTD: Output:
Microsoft (R) TTD 1.01.02
Release: 10.0.16366.1000
Copyright (C) Microsoft Corporation. All rights reserved.
Launching C:\Windows\Foo.exe
2017-09-21:17:18:10:320 : Error : DbgXUI.dll : TTD: Errors:
Error: Trace of C:\Windows\Foo.exe PID:0 did not complete successfully: status:27
Error: Could not open 'Foo.exe'; file not found.
Error: Corrupted trace dumped to C:\Users\User1\Documents\Foo01.run.err.
跟踪文件大小
TTD 跟踪文件可能非常大,必须确保有足够的可用磁盘空间。 如果仅记录了几分钟的应用或进程,跟踪文件的大小也可能会增大到几千兆字节。 跟踪文件的大小取决于下方所述的许多因素。
TTD 未设置最大跟踪文件大小,以允许复杂的长时间运行方案。 快速重新创建问题,将让跟踪文件尽可能小。
跟踪文件大小因素
虽然无法准确估计跟踪文件的大小,但有一些经验法则有助于弄清 TTD 文件的大小。
以下因素会影响跟踪文件的大小:
- 记录正在运行的应用或进程时在所有线程中执行的代码指令数
- 记录应用或进程的时间长度(仅因为这会影响记录的代码指令数)
- 应用或进程使用的内存数据的大小
执行和记录的指令数是影响跟踪文件大小的最大因素。 每条执行指令的跟踪通常需要 1 位到 1 个字节。 当记录的程序执行的不同函数数量较少、操作的数据集较小时,跟踪可能会接近该范围的下限。 当记录的程序执行了较多不同的函数或操作了较大的数据集时,跟踪可能会偏向于该范围的上限。
跟踪文件大小的经验规则
录制活动应用或进程时,跟踪文件每秒增长约 5 MB 到 50 MB,具体取决于上面确定的跟踪文件大小因素。
当正在记录的应用或进程处于空闲状态(例如等待输入时),跟踪文件将不会增长。
目前,跟踪文件没有最大文件大小限制。 WinDbg 可以重播大小达数百 GB 的跟踪文件。
索引文件大小
首次打开跟踪时,WinDbg 会自动创建索引文件。 它包含的信息有助于调试器更有效地重播有关内存的跟踪和查询信息。 其大小通常为跟踪文件大小的 1 到 2 倍。 影响其大小的因素类似于影响跟踪文件大小的因素。
首先,索引文件的大小与跟踪的长度成比例。 包含更多记录指令的跟踪通常会有较大的索引。
其次,索引的大小与内存访问的广度成比例。 如果被记录的程序经常访问大量不同的内存位置,则索引通常会比被记录的程序访问较少不同内存位置或访问内存位置频率较低时的索引更大。
由于这些因素与影响跟踪文件大小的因素类似,索引文件的大小通常会相对于索引文件的大小而缩放(因此我们估计索引文件的大小通常是跟踪文件的 1 到 2 倍)。
如果磁盘空间不足该怎么办?
TTD 跟踪和索引文件都会写入磁盘。 目前,跟踪或索引文件没有最大文件大小限制。 跟踪文件的大小会增大,直到停止记录或超过可用磁盘空间量。
记录期间:TTD 会将最后一页写入跟踪文件,然后有效等待,直到可以再次写入。 WinDbg 继续显示“录制”对话框,但在录制期间磁盘空间不足时不会显示错误/警告消息。
记录期间磁盘空间不足时,会导致跟踪文件中的代码执行记录不完整。 不完整的跟踪文件可以在 WinDbg 中打开,但如果在写入跟踪文件时磁盘空间不足后发生错误,则它可能不会包含实际问题。
解决方法:打开文件资源管理器并检查磁盘空间是否接近零。 或者在文件资源管理器(默认在文档文件夹中)中监视跟踪 (.RUN) 文件,如果大小未经常增大,则可能正在等待记录。 在 WinDbg 中选择“停止并调试”按钮,释放空间或保存到其他磁盘,然后重新开始记录。
在编制索引期间:调试器可能会生成无效的索引文件,从而导致调试器中出现不可预知的行为,或者调试器引擎主机可能会崩溃。
解决方法:关闭调试器并删除跟踪中可能存在的任何索引文件 (.idx)。 释放足够的磁盘空间,或者将跟踪文件移动到具有足够可用空间的其他磁盘。 在调试器中再次打开跟踪并运行 !index 以创建新的正确索引。 索引不会修改原始跟踪文件(.run),因此不会丢失任何数据。