259 lines
11 KiB
ReStructuredText
259 lines
11 KiB
ReStructuredText
Capturing a minidump
|
|
====================
|
|
|
|
*Minidumps* are files created by various Windows tools which record the
|
|
complete state of a program as it's running, or as it was at the moment
|
|
of a crash. Small minidumps are created by the Breakpad :ref:`crash
|
|
reporting <Crash Reporter>` tool, but sometimes that's not
|
|
sufficient to diagnose a problem. For example, if the application is
|
|
hanging (not responding to input, but hasn't crashed) then Breakpad is
|
|
not triggered, and it can be difficult to determine where the problem
|
|
lies. Sometimes a more complete form of minidump is needed to see
|
|
additional details about a crash, in which case manual capture of a
|
|
minidump is desired.
|
|
|
|
This page describes how to capture these minidumps on Windows, to permit
|
|
better debugging.
|
|
|
|
|
|
Privacy and minidumps
|
|
---------------------
|
|
|
|
.. warning::
|
|
|
|
**Warning!** Unlike the minidumps submitted by Breakpad, these
|
|
minidumps contain the **complete** contents of program memory. They
|
|
are therefore much more likely to contain private information, if
|
|
there is any in the browser. For this reason, you may prefer to
|
|
generate minidumps against a `clean
|
|
profile <http://support.mozilla.com/en-US/kb/Managing%20profiles>`__
|
|
where possible.
|
|
|
|
|
|
Capturing a minidump: application crash
|
|
---------------------------------------
|
|
|
|
To capture a full minidump for an application crash, you can use a tool called
|
|
**Debugging Tools for Windows**, which is provided by Microsoft for free.
|
|
|
|
|
|
Install Debugging Tools for Windows
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Please follow `these instructions
|
|
<https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/>`__.
|
|
You can install the Debugging Tools for Windows alone, but you cannot
|
|
download it alone. To install it, download Windows Software Development Kit
|
|
(SDK) first, start the installer, and then select only **Debugging Tools for
|
|
Windows** in the list of features to install.
|
|
|
|
.. image:: img/sdk-installer.png
|
|
|
|
The latest installer installs the tools for all CPU architectures (X86,
|
|
X64, ARM, and ARM64). You need to choose a tool of the architecture
|
|
matching Firefox you want to capture a minidump from. For example, if
|
|
you want to capture a minidump from 32-bit Firefox on 64-bit Windows,
|
|
use the X86 version of tools, not X64 tools.
|
|
|
|
The default install path of SDK for 64-bit Windows is
|
|
``%ProgramFiles(x86)%\Windows Kits\10``. The debugging tools can be found in
|
|
the folder named **Debuggers** under your install path of SDK.
|
|
|
|
The Debugging Tools for Windows contains both graphical and command line
|
|
debugging tools that can be used to capture a minidump. If you prefer
|
|
a graphical tool, please follow `Capture a minidump in a graphical way
|
|
<#capture-a-minidump-in-a-graphical-way>`__. If you prefer a command
|
|
line tool, please follow `Capture a minidump from the command line
|
|
<#capture-a-minidump-from-the-command-line>`__.
|
|
|
|
|
|
Capture a minidump in a graphical way
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
#. Launch the graphical debugger named WinDbg from the Start Menu. WinDbg
|
|
icons are registered under "Windows Kits" as below.
|
|
|
|
|WinDbg in Start Menu|
|
|
|
|
#. Connect Firefox to the debugger.
|
|
|
|
a. If Firefox is not already running, open the **"File"** menu on WinDbg
|
|
and choose **"Open Executable..."**. In the file chooser window that
|
|
appears, open the firefox.exe executable. If you're not sure about where
|
|
it is, please see `How to find the location of firefox.exe
|
|
<#how-to-find-the-location-of-firefox-exe>`__.
|
|
|
|
b. If Firefox is already running and you know which process you want to
|
|
capture a minidump from, open the **"File"** menu on WinDbg and choose
|
|
**"Attach to a Process..."**. In the "Attach to Process" dialog that
|
|
appears, select the process. To identify a process, please see
|
|
`Identify a process to attach a debugger to
|
|
<#identify-a-process-to-attach-a-debugger-to>`__.
|
|
|
|
#. You should now see a "Command" text window with debug output at the
|
|
top and an input box at the bottom. From the menu, select
|
|
``Debug → Go``, and Firefox should start. If the debugger spits out
|
|
some text right away and Firefox doesn't come up, select
|
|
``Debug → Go`` again.
|
|
|
|
#. When the program is about to crash, WinDbg will spit out more data,
|
|
and the prompt at the bottom will change from saying "``*BUSY*``" to
|
|
having a number in it. At this point, you should type
|
|
"``.dump /ma c:\temp\firefoxcrash.dmp``" -- without the quotes, but
|
|
don't forget the dot at the beginning. Once it completes, which can
|
|
take a fair while, you will have a very large file at
|
|
``c:\temp\firefoxcrash.dmp`` that can be used to help debug your
|
|
problem. File size will depend on this size of Firefox running in
|
|
your environment, which could several GB.
|
|
|
|
#. Ask in the relevant bug or thread how best to share this very large
|
|
file!
|
|
|
|
|
|
Capture a minidump from the command line
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
If Firefox is not already running, open the Command Prompt and run the following
|
|
command. This command launches all Firefox processes under a debugger. This
|
|
technique is useful when you have a startup crash or when you're not sure about
|
|
which process will crash.
|
|
|
|
To find out where firefox.exe is, please see `How to find the location
|
|
of firefox.exe <#how-to-find-the-location-of-firefox-exe>`__.
|
|
|
|
.. code::
|
|
|
|
<path to debugger>\cdb.exe -g -G -o <path to firefox>\firefox.exe
|
|
|
|
|
|
For example, if both the debugging tools and Firefox are installed in the
|
|
default folder and you want to capture a minidump of 64-bit Firefox,
|
|
the command will be like this. Please note that you need to add double
|
|
quotes when a path contains one or more whitespaces.
|
|
|
|
.. code::
|
|
|
|
"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\cdb.exe" -g -G -o "C:\Program Files\Mozilla Firefox\firefox.exe"
|
|
|
|
|
|
If a Firefox process you want to capture a minidump from is already running,
|
|
attach the debugger to it with the following command. To identify a process,
|
|
please see `Identify a process to attach a debugger to
|
|
<#identify-a-process-to-attach-a-debugger-to>`__.
|
|
|
|
.. code::
|
|
|
|
<path to debugger>\cdb.exe -g -G -p <PID>
|
|
|
|
When the process crashes, the debugger tool captures it and waits for your
|
|
command. At this point, you should type ``.dump /ma c:\temp\firefoxcrash.dmp``
|
|
-- don't forget the dot at the beginning. Once it completes, which can take
|
|
a fair while, you will have a very large file at ``c:\temp\firefoxcrash.dmp``
|
|
that can be used to help debug your problem. File size will depend on this
|
|
size of Firefox running in your environment, which could several GB.
|
|
|
|
After a minidump is generated, type ``q`` and press Enter to quit the debugger.
|
|
|
|
|
|
Capturing a minidump: application hang
|
|
--------------------------------------
|
|
|
|
On Windows Vista and Windows 7, you can follow `these
|
|
instructions <http://support.microsoft.com/kb/931673>`__ to capture a
|
|
dump file and locate it after it's been saved.
|
|
|
|
|
|
Identify a process to attach a debugger to
|
|
------------------------------------------
|
|
|
|
When you're running Firefox, even if you have only a single tab, you may have
|
|
noticed a bunch of firefox.exe instances in Task Manager. This means Firefox
|
|
consists of multiple processes. Since an application crash happens per process
|
|
and a minidump is generated per process, you need to identify which process will
|
|
crash before starting a debugger.
|
|
|
|
Identify a process type
|
|
~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Each instance of firefox.exe has a type. To identify a process to attach
|
|
a debugger to, you need to know its process type first.
|
|
|
|
When a crash happens, if all Firefox windows are suddenly gone and Mozilla
|
|
Crash Reporter window is opend, a process that crashed is the main process.
|
|
|
|
.. image:: img/crashreporter.png
|
|
|
|
When a crash happens, if you see the following page, a process that crashed
|
|
is a tab (content) process.
|
|
|
|
.. image:: img/tabcrashed.png
|
|
|
|
There are more process types, but there isn't an easy way to detect a crash in
|
|
a process of those types because the symptom varies. If you cannot be sure
|
|
about the type of a crashing process, terminate Firefox and launch a new
|
|
instance of Firefox under a debugger in the way described above.
|
|
|
|
If a GPU process crashes, you may see a window is not rendered correctly as
|
|
below. Since the main process relaunches a GPU process, this symptom will be
|
|
transient and the window will be rendered correctly again.
|
|
|
|
.. image:: img/crash-gpu.png
|
|
|
|
If a GMP (= Gecko Media Plugin) process crashes, you will see an information
|
|
bar will be displayed below the address bar.
|
|
|
|
.. image:: img/crash-gmp.png
|
|
|
|
If an RDD (= Remote Data Decoder) process crashes, Firefox may stop playing
|
|
a video as below, but not limited to this symptom.
|
|
|
|
.. image:: img/crash-rdd.png
|
|
|
|
|
|
Identify a process ID (PID)
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Once you understand what type of process crashes, the next step is to get a
|
|
process ID (PID), which is a value to specify in the debugger command we
|
|
discussed above. We present two ways to get a PID here.
|
|
|
|
The first way is to use Firefox itself. Open a new tab and go to the
|
|
**about:processes** page. This page shows the list of all processes and their
|
|
PIDs. In the example below, the PID of the main process is **6308** and the
|
|
PID of the tab process hosting a page of mozilla.org is **6748**.
|
|
|
|
.. image:: img/about-processes.png
|
|
|
|
The second way is to use `Process Explorer
|
|
<https://docs.microsoft.com/en-us/sysinternals/downloads/process-explorer>`__,
|
|
which is provided by Microsoft for free. You may need this technique to attach
|
|
a debugger to a hung process or when you cannot open a new tab in the existing
|
|
Firefox for some reason.
|
|
|
|
Process Explorer is basically an advanced version of Task Manager. Since it
|
|
displays processes in a hierarchical tree view, you can easily locate the main
|
|
process, which is the parent of all child processes. In the example below, the
|
|
PID of the main process is **6308** and all processes, including
|
|
plugin-container.exe, under the main process is child processes.
|
|
|
|
Another helpful feature of Process Explorer is that when you hover the mouse
|
|
cursor on a process, it displays a tooltip window showing the process's command
|
|
line string. For a child process of firefox.exe, the command line's last
|
|
keyword shows the process type, so you can tell which process is which process
|
|
type. In the example below, the tooltip window displays a command line string
|
|
of a GPU process.
|
|
|
|
.. image:: img/process-explorer.png
|
|
|
|
|
|
How to find the location of firefox.exe
|
|
---------------------------------------
|
|
|
|
If you're not sure about the location of the executable file (firefox.exe) of
|
|
Firefox you run, you can find it in the **about:support** page. In the
|
|
"Application Basics" section, the path to firefox.exe is displayed in the row
|
|
of "Application Binary".
|
|
|
|
.. image:: img/about-support.png
|
|
|
|
.. |WinDbg in Start Menu| image:: img/windbg-in-startmenu.png
|
|
:width: 50%
|