用户模式转储文件

本文概述了用户模式转储文件,以及如何使用这些文件来帮助解决 bug 和崩溃。

有关分析转储文件的信息,请参阅 分析用户模式转储文件

用户模式转储文件的类型

提供了多种类型的用户模式故障转储文件。 不同类型的转储文件分为两类:

可以通过分析转储文件来获取大量信息。 但是,任何转储文件都不能提供使用调试器调试故障时获得的信息量。

完整用户模式转储

完整的用户模式转储是基本的用户模式转储文件。 完整的用户模式转储文件包括:

  • 进程的整个内存空间。
  • 程序的可执行映像。
  • 句柄表。
  • 其他信息,可帮助调试器在转储发生时重建正在使用的内存。

可以将完整的用户模式转储文件 收缩 为小型转储。 若要收缩完整的用户模式转储文件,请先在调试器中加载转储文件。 然后,使用 .dump (创建转储文件) 命令以小型转储格式保存新的转储文件。

尽管其名称较大,但最大的小型转储文件包含的信息比完整的用户模式转储文件还多。 例如, .dump /mf.dump /ma 命令创建比 .dump /f 命令更大、更完整的文件。

在用户模式下, .dump /m[MiniOptions] 通常是最佳选择。 使用此开关创建的转储文件的大小可能从非常小到非常大不等。 通过指定正确的 MiniOptions 开关,可以准确控制包含哪些信息。

Minidumps

小型转储文件的大小和内容因要转储的程序、执行转储的应用程序和所选选项而异。 有时,小型转储文件的大小适中,并且包含完整的内存和句柄表。 在其他情况下,小型转储文件要小得多。 例如,小型转储文件可能仅包含有关单个线程的信息,也可能仅包含有关堆栈中引用的模块的信息。

术语 minidump 具有误导性,因为最大的小型转储文件包含的信息比完整的用户模式转储文件更多。 例如, .dump /mf.dump /ma 创建一个比 .dump /f的更大、更完整的文件。 因此,建议使用 .dump /m[MiniOptions] 而不是 .dump /f 创建所有用户模式转储文件。

如果使用调试器创建小型转储文件,则可以选择要包含的信息。 命令 .dump /m 包括有关构成目标进程的已加载模块、线程信息和堆栈信息的基本信息。 可以使用下表中所述的任何开关选项修改基本命令:

.dump 选项 对转储文件的影响
/ma 创建包含所有可选添加项的小型转储。 选项 /ma 等效于 /mfFhut。 它将完整内存数据、处理数据、卸载的模块信息、基本内存信息和线程时间信息添加到小型转储。
/mf 将完整内存数据添加到小型转储。 包括目标应用程序拥有的所有可访问的提交页面。
/mF 将所有基本内存信息添加到小型转储。 此开关将流添加到包含所有基本内存信息的小型转储,而不仅仅是有关有效内存的信息。 调试器使用信息重建进程的完整虚拟内存布局(调试小型转储时)。
/mh 将有关与目标应用程序关联的句柄的数据添加到小型转储。
/mu 将卸载的模块信息添加到小型转储。 此选项仅在 Windows Server 2003 及更高版本的 Windows 中可用。
/mt 将更多线程信息添加到小型转储。 线程信息包括线程时间,可以在调试小型转储时使用 .ttime (显示线程时间) 显示线程时间。
/mi 将辅助内存添加到小型转储。 辅助内存 是堆栈或后备存储上的指针引用的任何内存,以及围绕此地址的小区域。
/mp 将进程环境块和线程环境块数据添加到微型转储。 如果需要访问有关应用程序进程和线程的 Windows 系统信息,此信息可能很有用。
/mw 将所有提交的读写专用页添加到小型转储。
/md 将可执行映像中的所有读写数据段添加到小型转储。
/mc 在图像中添加代码节。
/mr 从堆栈的小型转储部分中删除,并存储不用于重新创建堆栈跟踪的内存。 局部变量和其他数据类型值也会被删除。 (未使用的内存部分) 为零,此选项不会使小型转储更小,但如果想要保护其他应用程序的隐私,此选项会很有用。
/mR 从小型转储中删除完整的模块路径。 仅包含模块 名称 。 如果要保护用户的目录结构的隐私,此选项非常有用。

可以组合这些开关选项。 例如,使用 命令 .dump /mfiu 创建一个中等大的小型转储,其中包含卸载内存和辅助内存。 使用 命令 .dump /mrR 创建可删除用户部分信息的小型转储。 有关完整的语法详细信息,请参阅 .dump (创建转储文件)

用于创建转储文件的工具

可以使用多种不同的工具来创建用户模式转储文件:

  • ProcDump
  • CDB
  • WinDbg

ProcDump

ProcDump 是一种命令行实用工具,可用于监视应用程序的 CPU 峰值,并在峰值期间生成故障转储。 管理员或开发人员可以使用故障转储文件来确定峰值的原因。 ProcDump 还包括监视挂起的窗口 (,方法是使用与 Windows 和任务管理器使用的窗口挂起相同的定义) 和未经处理的异常。 可以使用 ProcDump 根据系统性能计数器的值生成转储。 ProcDump 还可以用作可嵌入其他脚本中的常规进程转储实用工具。

有关使用 Sysinternals ProcDump 实用工具创建用户模式转储文件的信息,请参阅 ProcDump

CDB 和 WinDbg

控制台调试器 (CDB) 和 Windows 调试器 (WinDbg) 是 Windows 软件开发工具包和 Windows 驱动程序工具包中包含的调试工具。 请参阅 下载并安装 WinDbg Windows 调试器中的安装选项。

可以通过多种方式使用 CDB 或 WinDbg 创建用户模式转储文件:

  • 自动创建转储文件。
  • 调试时创建转储文件。
  • 收缩现有转储文件。

有关工具的详细信息,请参阅使用 CDB进行 Windows 调试和调试入门。

自动创建转储文件

发生应用程序错误时,Windows 可能会通过多种方式之一做出响应,具体取决于事后调试设置。 如果这些设置指示调试工具创建转储文件,则会创建用户模式内存转储文件。 有关详细信息,请参阅 启用事后调试

调试时创建转储文件

当 CDB 或 WinDbg 调试用户模式应用程序时,还可以使用 .dump (创建转储文件) 命令来创建转储文件。

此命令不会导致目标应用程序终止。 通过选择特定的命令选项,可以创建一个包含所需信息的小型转储文件。

收缩现有转储文件

可以使用 CDB 或 WinDbg 收缩转储文件。 若要收缩转储文件,请开始调试现有转储文件。 然后,使用 .dump 命令创建较小大小的转储文件。

时间旅行调试

调试用户模式应用程序的另一个选项是时间旅行调试 (TTD) 。 TTD 是一种工具,可用于在进程运行时记录进程。 可以重播调试器会话的录制以查找 bug。 可以轻松转到录制的不同部分,以了解导致 bug 的条件以及如何修复问题。

TTD 比故障转储文件具有显著优势,后者通常缺少导致失败的代码执行。 在代码执行中向后移动的能力对于确定根本原因很有用。

有关详细信息,请参阅 按时间顺序调试概述

后续步骤