调试 Minidump¶
此页面是从 MDN 导入的,内容可能已过时 |
The minidump 文件格式包含 Windows 上崩溃的相关数据。它被 rust-minidump、Breakpad 以及各种 Windows 调试工具使用。每个 Minidump 包含以下数据。
导致崩溃的异常的详细信息。
进程中每个线程的信息:进程停止时正在执行的地址和寄存器状态。
崩溃时加载到进程中的共享库列表。
每个线程的堆栈内存。
崩溃地址周围的内存。
(可选) 如果应用程序请求,则为其他内存区域。
(可选) 其他特定于平台的数据。
从崩溃报告中访问 Minidump¶
并非所有人都可以访问 Minidump。有关如何获取访问权限以及在哪里查找崩溃报告的 Minidump 文件的详细信息,请参阅 崩溃报告文档
使用 rust-minidump 的工具¶
我们的大部分崩溃报告基础设施都基于 rust-minidump。主要工具是 minidump-stackwalk CLI 应用程序,其中包含详尽的用户文档。
该文档包含一个 专门章节,介绍如何在本地分析 Firefox 崩溃报告和 Minidump。
如果您正在寻找 minidump_dump,它包含在 minidump-stackwalk 中。
使用 MS Visual Studio 调试器¶
设置调试器以 使用 Mozilla 符号服务器 和 源服务器。
双击 Minidump 文件以在调试器中打开它。
加载完成后,单击 Visual Studio 调试器工具栏中看起来像播放按钮的绿色图标。
对于 Firefox 41 之前的版本,您还需要安装相关的 Firefox 版本(例如,从 这里),并将它所在的目录(例如,“C:Program FilesMozilla Firefox 3.6 Beta 1”)添加到设置符号服务器的相同对话框中(如果 Minidump 中的二进制文件位置与您机器上的位置不同)。请注意,您可以将相关版本安装在任何位置。只需确保将符号服务器配置到您安装它的目录即可。对于 41 及更高版本的发布版,二进制文件可在符号服务器上获得。
如果这不起作用,请下载完全的构建和崩溃报告程序符号文件。这些可以在 treeherder/build 文件夹中找到。加载 Visual Studio,然后转到文件 -> 打开 -> minidump 位置。单击“运行本机”,Visual Studio 将询问相应的符号文件。对于您希望具有符号的每个 .dll,您必须转到控制台并转到相应的目录。例如(xul.dll 应转到崩溃报告程序符号目录中的 xul.pdf)。每个目录都将有一个 .pd_ 文件。在命令行中运行:“expand /r foo.pd_”。然后将 Visual Studio 指向此目录。
然后您将能够检查
堆栈跟踪 |
调试器显示堆栈跟踪。您可以右键单击堆栈中的任何帧,然后选择“转到反汇编”或“转到源”。(从源视图中选择“转到反汇编”可能会因为优化而无法将您带到正确的位置。)查看源代码时,请注意调试信息会将所有内联函数作为其内联到的行的部分,并且编译器(使用 PGO)非常积极地内联(包括内联虚拟函数)。您通常可以通过阅读反汇编来弄清楚您 *真正* 在哪里。 |
寄存器 |
在“寄存器”选项卡(如果您未打开,则为“调试”->“窗口”->“寄存器”)中,您可以查看与每个堆栈帧关联的寄存器,但只能查看当前状态(即,崩溃时)。Visual Studio 无法识别的寄存器将显示为灰色,且值为 00000000。 |
堆栈内存 |
您可以使用“调试”->“窗口”->“内存”菜单项打开一个窗口(“内存 1”等),该窗口显示连续的内存段。然后,您可以在此窗口中输入堆栈指针(ESP 寄存器)的地址,并查看堆栈上的内存。(Minidump 没有堆上的内存。)最好将窗口右上角的“宽度”下拉列表从其默认的“自动”更改为“8”或“16”,以便内存显示与字对齐。如果您对指针感兴趣,这通常是这种情况,您可以右键单击此窗口并将显示更改为显示 4 字节字(这样您就不必因为小端序而反转顺序)。此视图结合反汇编,通常可以用来重建超出函数参数显示的信息。 |
局部变量 |
在“监视 1”(等)窗口(如果您没有打开,则可以通过“调试”->“窗口”->“监视”获取)中,您可以键入表达式(例如,局部变量的名称),调试器将显示其值(尽管它有时会出错)。如果您正在查看指向堆栈上变量的指针,您甚至可以通过键入表达式来检查成员变量。如果 Visual Studio 无法从 Minidump 中找出某些内容,它可能会显示 00000000(这是真的吗?)。 |
在 Linux 上使用 minidump-2-core¶
The Breakpad 源码 包含一个名为 minidump-2-core 的工具,它将 Linux Minidump 转换为核心文件。如果您签出并构建 Breakpad,则二进制文件将位于 src/tools/linux/md2core/minidump-2-core
。使用 Linux Minidump 的路径运行二进制文件将在 stdout 上生成一个核心文件,然后可以照常在 gdb 中加载。您需要手动下载匹配的 Firefox 二进制文件,然后可以使用 GDB Python 脚本 下载符号。
The minidump-2-core
源代码目前不支持处理与构建它的系统不同的 CPU 架构的 Minidump。例如,如果您想在 ARM 转储上使用它,您可能需要为 ARM 构建该工具并在 QEMU 下运行它。
使用其他工具检查 Minidump 数据¶
Ted 有几个工具可以针对已构建的 Breakpad 副本进行构建,以进行更有针对性的检查。所有这些工具都假设您已在 Breakpad 签出旁边的一个目录中签出其源代码,并且您已在同一级别的名为 obj-breakpad
的 objdir 中构建了 Breakpad。
stackwalk-http 是 Breakpad 的 minidump_stackwalk 的一个版本,它可以通过 HTTP 获取符号,并且还内置了 Mozilla 符号服务器 URL。如果您像
stackwalk /path/to/dmp /tmp/syms
那样运行它,它将打印堆栈跟踪并在/tmp/syms
中保存它下载的符号。请注意,符号仅上传到 nightly 和发布版本的符号服务器,而不是每个更改的构建。dump-lookup 获取 Minidump 并打印堆栈上可能为返回地址的值。当堆栈跟踪看起来被截断或错误时,这很有用。它需要符号文件才能生成有用的输出,因此您通常需要先运行
stackwalk-http
来下载它们。get-minidump-instructions 从 Minidump 中检索并显示故障指令指针周围的内存范围。您几乎总是希望使用
--disassemble
选项运行它,这将使它通过objdump
发送字节以显示反汇编指令。如果您还提供符号路径(请参阅上面的stackwalk-http
),它可以从 hg.mozilla.org 下载匹配的源文件,并在反汇编中显示源代码。minidump-modules 会接收一个minidump文件并打印崩溃进程的模块列表。它会打印每个模块的完整路径,而Socorro UI出于隐私原因仅打印每个模块的文件名。它还接受一个 -v 选项来打印每个模块的调试ID,以及一个 -d 选项来打印将用于替换模块文件名的符号文件的相对路径。
获取崩溃的B2G进程的堆栈跟踪¶
在手机上的 /data/b2g/mozilla/*.default/minidump/ 目录下获取minidump文件。您可以使用 adb pull 来完成此操作。
使用命令 ./build.sh buildsymbols 在B2G代码树中构建调试符号。符号文件将生成在 $OBJDIR/dist/crashreporter-symbols 中。
构建并安装 google-breakpad。
使用 minidump-stackwalk 工具获取堆栈跟踪。
Example:
$ cd B2G
$ adb pull /data/b2g/mozilla/*.default/minidump/*.dmp .
$ls *.dmp
71788789-197e-d769-67167423-4e7aef32.dmp
$ minidump-stackwalk 71788789-197e-d769-67167423-4e7aef32.dmp objdir-debug/dist/crashreporter-symbols/