捕获小型转储

小型转储是由各种 Windows 工具创建的文件,这些文件记录了程序运行时的完整状态,或程序在崩溃时的状态。Breakpad 崩溃报告工具会创建小型转储,但有时这不足以诊断问题。例如,如果应用程序挂起(没有响应输入,但没有崩溃),则不会触发 Breakpad,并且很难确定问题所在。有时需要更完整形式的小型转储以查看有关崩溃的其他详细信息,在这种情况下,需要手动捕获小型转储。

此页面介绍如何在 Windows 上捕获这些小型转储,以实现更好的调试。

隐私和小型转储

警告

警告!与 Breakpad 提交的小型转储不同,这些小型转储包含程序内存的完整内容。因此,如果浏览器中存在任何私密信息,它们更有可能包含这些信息。因此,您可能更倾向于针对干净配置文件生成小型转储(如果可能)。

捕获小型转储:应用程序崩溃

要捕获应用程序崩溃的完整小型转储,您可以使用名为Windows 调试工具的工具,该工具由 Microsoft 免费提供。

安装 Windows 调试工具

请遵循这些说明。您可以单独安装 Windows 调试工具,但无法单独下载它。要安装它,请先下载 Windows 软件开发工具包 (SDK),启动安装程序,然后在要安装的功能列表中仅选择Windows 调试工具

../../_images/sdk-installer.png

最新的安装程序会为所有 CPU 架构(X86、X64、ARM 和 ARM64)安装工具。您需要选择与要从中捕获小型转储的 Firefox 的架构匹配的工具。例如,如果您想从 32 位 Firefox(在 64 位 Windows 上)捕获小型转储,请使用工具的 X86 版本,而不是 X64 工具。

64 位 Windows 的 SDK 默认安装路径为%ProgramFiles(x86)%\Windows Kits\10。调试工具可以在 SDK 安装路径下的名为Debuggers的文件夹中找到。

Windows 调试工具包含图形和命令行调试工具,可用于捕获小型转储。如果您更喜欢图形工具,请遵循以图形方式捕获小型转储。如果您更喜欢命令行工具,请遵循从命令行捕获小型转储

以图形方式捕获小型转储

  1. 从“开始”菜单启动名为 WinDbg 的图形调试器。WinDbg 图标在“Windows Kits”下注册,如下所示。

    WinDbg in Start Menu

  2. 将 Firefox 连接到调试器。

    1. 如果 Firefox 尚未运行,请在 WinDbg 上打开“文件”菜单,然后选择“打开可执行文件...”。在出现的“文件选择器”窗口中,打开 firefox.exe 可执行文件。如果您不确定它在哪里,请参阅如何查找 firefox.exe 的位置

    2. 如果 Firefox 已经在运行,并且您知道要从中捕获小型转储的进程,请在 WinDbg 上打开“文件”菜单,然后选择“附加到进程...”。在出现的“附加到进程”对话框中,选择该进程。要识别进程,请参阅识别要附加调试器的进程

  3. 您现在应该会看到一个“命令”文本窗口,顶部显示调试输出,底部显示输入框。从菜单中选择Debug Go,Firefox 应该会启动。如果调试器立即输出一些文本并且 Firefox 没有启动,请再次选择Debug Go

  4. 当程序即将崩溃时,WinDbg 会输出更多数据,底部的提示会从显示“*BUSY*”更改为包含数字。此时,您应该输入“.dump /ma c:\temp\firefoxcrash.dmp” - 不要加引号,但不要忘记开头的点。完成后,这可能需要一段时间,您将在c:\temp\firefoxcrash.dmp处获得一个非常大的文件,该文件可用于帮助调试您的问题。文件大小将取决于您环境中运行的 Firefox 的大小,这可能是几个 GB。

  5. 在相关的错误或线程中询问如何最好地共享此非常大的文件!

从命令行捕获小型转储

如果 Firefox 尚未运行,请打开命令提示符并运行以下命令。此命令在调试器下启动所有 Firefox 进程。当您遇到启动崩溃或不确定哪个进程会崩溃时,此技术很有用。

要查找 firefox.exe 在哪里,请参阅如何查找 firefox.exe 的位置

<path to debugger>\cdb.exe -g -G -o <path to firefox>\firefox.exe

例如,如果调试工具和 Firefox 都安装在默认文件夹中,并且您想捕获 64 位 Firefox 的小型转储,则命令如下所示。请注意,当路径包含一个或多个空格时,您需要添加双引号。

"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\cdb.exe" -g -G -o "C:\Program Files\Mozilla Firefox\firefox.exe"

如果要从中捕获小型转储的 Firefox 进程已经在运行,请使用以下命令将其附加到调试器。要识别进程,请参阅识别要附加调试器的进程

<path to debugger>\cdb.exe -g -G -p <PID>

当进程崩溃时,调试器工具会捕获它并等待您的命令。此时,您应该输入.dump /ma c:\temp\firefoxcrash.dmp - 不要忘记开头的点。完成后,这可能需要一段时间,您将在c:\temp\firefoxcrash.dmp处获得一个非常大的文件,该文件可用于帮助调试您的问题。文件大小将取决于您环境中运行的 Firefox 的大小,这可能是几个 GB。

生成小型转储后,键入q并按 Enter 退出调试器。

捕获小型转储:应用程序挂起

在 Windows Vista 和 Windows 7 上,您可以按照这些说明捕获转储文件并在保存后找到它。

识别要附加调试器的进程

当您运行 Firefox 时,即使您只有一个选项卡,您也可能注意到任务管理器中有很多 firefox.exe 实例。这意味着 Firefox 由多个进程组成。由于应用程序崩溃发生在每个进程中,并且每个进程都会生成一个小型转储,因此您需要在启动调试器之前识别哪个进程会崩溃。

识别进程类型

每个 firefox.exe 实例都有一个类型。要识别要附加调试器的进程,您需要首先了解其进程类型。

当发生崩溃时,如果所有 Firefox 窗口突然消失并且打开了 Mozilla 崩溃报告程序窗口,则崩溃的进程为主进程。

../../_images/crashreporter.png

当发生崩溃时,如果您看到以下页面,则崩溃的进程为选项卡(内容)进程。

../../_images/tabcrashed.png

还有更多进程类型,但没有简单的方法来检测这些类型进程中的崩溃,因为症状各不相同。如果您不确定崩溃进程的类型,请终止 Firefox 并按照上述方式在调试器下启动 Firefox 的新实例。

如果 GPU 进程崩溃,您可能会看到窗口渲染不正确,如下所示。由于主进程会重新启动 GPU 进程,因此此症状将是短暂的,窗口将再次正确渲染。

../../_images/crash-gpu.png

如果 GMP (= Gecko 媒体插件) 进程崩溃,您会看到在地址栏下方显示信息栏。

../../_images/crash-gmp.png

如果 RDD (= 远程数据解码器) 进程崩溃,Firefox 可能会停止播放视频,如下所示,但这并不限于此症状。

../../_images/crash-rdd.png

识别进程 ID (PID)

了解了哪种类型的进程会崩溃后,下一步是获取进程 ID (PID),这是一个值,用于在上面讨论的调试器命令中指定。我们在这里介绍两种获取 PID 的方法。

第一种方法是使用 Firefox 本身。打开一个新选项卡并转到about:processes页面。此页面显示所有进程及其 PID 的列表。在下面的示例中,主进程的 PID 为6308,托管 mozilla.org 页面的选项卡进程的 PID 为6748

../../_images/about-processes.png

第二种方法是使用Process Explorer,它是微软免费提供的。您可能需要此技术将调试器附加到挂起的进程,或者在您由于某种原因无法在新选项卡中打开现有的 Firefox 时使用。

Process Explorer 基本上是任务管理器的增强版。因为它以分层树状视图显示进程,所以您可以轻松地找到主进程,它是所有子进程的父进程。在下面的示例中,主进程的 PID 为6308,所有进程(包括 plugin-container.exe)都在主进程下,都是子进程。

Process Explorer 的另一个有用功能是,当您将鼠标光标悬停在某个进程上时,它会显示一个工具提示窗口,其中显示该进程的命令行字符串。对于 firefox.exe 的子进程,命令行的最后一个关键字显示了进程类型,因此您可以分辨哪个进程是哪种类型的进程。在下面的示例中,工具提示窗口显示了一个 GPU 进程的命令行字符串。

../../_images/process-explorer.png

如何查找 firefox.exe 的位置

如果您不确定运行的 Firefox 的可执行文件 (firefox.exe) 的位置,可以在about:support页面中找到它。在“应用程序基础”部分,“应用程序二进制文件”行中显示了 firefox.exe 的路径。

../../_images/about-support.png