用户模式转储文件

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

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

用户模式转储文件的类型

可用的用户模式崩溃转储文件种类繁多。 不同类别的转储文件分为两大类:

可以通过分析转储文件来获取大量信息。 但是,任何转储文件都无法提供使用调试器调试崩溃时获取的信息量。

完全用户模式转储

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

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

可以将完整的用户模式转储文件 精简 到小型转储文件中。 若要收缩完整的用户模式转储文件,请先在调试器中加载转储文件。 然后,使用 .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 将线程信息更多地添加到 minidump。 线程信息包括线程时间,可以在调试小型内存转储时使用 .ttime(显示线程时间) 来显示线程时间。
/mi 将辅助内存添加到小型转储。 辅助内存 是堆栈或后备存储上的指针引用的任何内存,以及此地址周围的小区域。
/mp 向小型转储中添加进程环境块和线程环境块数据。 如果需要访问有关应用程序的进程和线程的 Windows 系统信息,此信息非常有用。
/mw 将所有提交的读写专用页面收集到小型转储中。
/md 将可执行映像中的所有读写数据段添加到小型转储。
/mc 在映像中添加代码节。
/mr 从堆栈的小型转储部分中删除,并存储不用于重新创建堆栈跟踪的内存。 也会删除局部变量和其他数据类型值。 此选项不会使小型转储更小(未使用的内存分区为零),但如果想要保护其他应用程序的隐私,则它很有用。
/mR 从小型转储中删除全部的模块路径。 仅包含模块 名称 。 如果要保护用户的目录结构的隐私,此选项非常有用。

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

用于创建转储文件的工具

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

ProcDump

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

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

WinDbg 和 CDB

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

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

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

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

自动创建转储文件

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

调试时创建转储文件

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

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

收缩现有转储文件

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

时间旅行调试

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

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

有关详细信息,请参阅 时间旅行调试概述

另请参阅