177 lines
6.1 KiB
ReStructuredText
177 lines
6.1 KiB
ReStructuredText
Debugging Firefox with Valgrind
|
|
===============================
|
|
|
|
+--------------------------------------------------------------------+
|
|
| This page is an import from MDN and the contents might be outdated |
|
|
+--------------------------------------------------------------------+
|
|
|
|
This page describes how to use Valgrind (specifically, its Memcheck
|
|
tool) to find memory errors.
|
|
|
|
Supported platforms
|
|
-------------------
|
|
|
|
Valgrind runs desktop Firefox fine on Linux, especially on x86 and
|
|
x86-64. Firefox for Android and Firefox OS on ARMv7 should also run,
|
|
though perhaps not as smoothly. The other architectures supported by
|
|
Valgrind on Linux (AARCH64, PPC{32,64}, MIPS{32,64}, S390X) should also
|
|
work, in theory.
|
|
|
|
MacOS X 10.10 (Yosemite), 64-bit only, works, although it can be a bit
|
|
of a rough ride.
|
|
|
|
- Expect lower performance and a somewhat higher false positive error
|
|
rate than on Linux.
|
|
- Valgrind's handling of malloc zones on Yosemite is imperfect. Regard
|
|
leak reports with caution.
|
|
- Valgrind has been known to cause kernel panics, for unknown reasons.
|
|
|
|
Where to get Valgrind
|
|
---------------------
|
|
|
|
Linux: Download `Valgrind <https://valgrind.org/>`__ directly, or use
|
|
your distribution's package manager (if it has a recent enough version).
|
|
|
|
MacOSX: `Get Valgrind trunk from
|
|
SVN <https://valgrind.org/downloads/repository.html>`__ and build it.
|
|
Don't use 3.10.x or any other tarball.
|
|
|
|
Make sure you have Valgrind 3.14 or later, version 3.16.1 is known to work,
|
|
3.13.0 did not. Newer versions tend to have better compatibility with both
|
|
Firefox's JITs and newer toolchain components (compiler, libc and linker
|
|
versions).
|
|
|
|
Basics
|
|
------
|
|
|
|
Build
|
|
~~~~~
|
|
|
|
Build Firefox with the following options, which maximize speed and
|
|
accuracy.
|
|
|
|
.. code::
|
|
|
|
ac_add_options --disable-jemalloc
|
|
ac_add_options --disable-strip
|
|
ac_add_options --enable-valgrind
|
|
ac_add_options --enable-optimize="-g -O2"
|
|
ac_add_options --disable-sandbox
|
|
|
|
Run
|
|
~~~
|
|
|
|
Note that programs run *much* more slowly under Valgrind than they do
|
|
natively. Slow-downs of 20x or 30x aren't unexpected, and it's slower on
|
|
Mac than on Linux. Don't try this on an underpowered machine.
|
|
|
|
Linux
|
|
^^^^^
|
|
|
|
On Linux, run Valgrind with the following options.
|
|
|
|
.. code::
|
|
|
|
--smc-check=all-non-file --vex-iropt-register-updates=allregs-at-mem-access --show-mismatched-frees=no --read-inline-info=yes
|
|
|
|
The ``--smc-check`` and ``--vex-iropt-register-updates`` options are
|
|
necessary to avoid crashes in JIT-generated code.
|
|
|
|
The ``--show-mismatched-frees`` option is necessary due to inconsistent
|
|
inlining of ``new`` and ``delete`` -- i.e. one gets inlined but the
|
|
other doesn't -- which lead to false-positive mismatched-free errors.
|
|
|
|
The ``--read-inline-info`` option improves stack trace readability in
|
|
the presence of inlining.
|
|
|
|
Also, run with the following environment variable set.
|
|
|
|
.. code::
|
|
|
|
G_SLICE=always-malloc
|
|
|
|
This is necessary to get the Gnome system libraries to use plain
|
|
``malloc`` instead of pool allocators.
|
|
|
|
Mac
|
|
^^^
|
|
|
|
On Mac, run Valgrind with the following options.
|
|
|
|
.. code::
|
|
|
|
--smc-check=all-non-file --vex-iropt-register-updates=allregs-at-mem-access --show-mismatched-frees=no --dsymutil=yes
|
|
|
|
The ``--dsymutil`` option ensures line number information is present in
|
|
stack traces.
|
|
|
|
Advanced usage
|
|
--------------
|
|
|
|
Shared suppression files
|
|
~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
`/build/valgrind/ <https://searchfox.org/mozilla-central/source/build/valgrind/>`__
|
|
contains the suppression files used by the periodic Valgrind jobs on
|
|
Treeherder. Some of these files are platform-specific.
|
|
|
|
Running mochitests under Valgrind?
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
To run a mochitest under Valgrind, use the following command.
|
|
|
|
.. code:: bash
|
|
|
|
$ ./mach mochitest-plain --debugger="valgrind" --debugger-args="$VALGRIND_OPTIONS" relative/path/to/tests
|
|
|
|
Where ``$VALGRIND_OPTIONS`` are the options described
|
|
:ref:`above <Debugging Firefox With Valgrind>`. You might also
|
|
need ``--trace-children=yes`` to trace into child processes.
|
|
|
|
As of December 2014 it is possible to do a complete run of
|
|
mochitests-plain on Valgrind in about 8 CPU hours on a Core i4910
|
|
(Haswell) machine. Maximum process size is 5.4G, of which about 80% is
|
|
in memory. Runs of small subsets of mochitests take far less memory.
|
|
|
|
Bits and pieces
|
|
~~~~~~~~~~~~~~~
|
|
|
|
For un-released Linux distros (Fedora Rawhide, etc.) you'll need to use
|
|
a version of Valgrind trunk build, because fixes for the latest gcc and
|
|
glibc versions appear there first. Without them you'll be flooded with
|
|
false errors from Memcheck, and have debuginfo reading problems.
|
|
|
|
On Linux, code compiled by LLVM at high optimisation levels can cause
|
|
Memcheck to report false uninitialised value errors. See
|
|
`here <https://bugs.kde.org/show_bug.cgi?id=242137#c3>`__ for an easy
|
|
workaround. On Mac, Valgrind has this workaround built in.
|
|
|
|
You can make stack traces easier to read by asking for source file names
|
|
to be given relative to the root of your source tree. Do this by using
|
|
``--fullpath-after=`` to specify the rightmost part of the absolute path
|
|
that you don't want to see. For example, if your source tree is rooted
|
|
at ``/home/sewardj/MC-20-12-2014``, use ``--fullpath-after=2014/`` to
|
|
get path names relative to the source directory.
|
|
|
|
The ``--track-origins=yes`` slows down Valgrind greatly, so don't use it
|
|
unless you are hunting down a specific uninitialised value error. But if
|
|
you are hunting down such an error, it's extremely helpful and worth
|
|
waiting for.
|
|
|
|
Additional help
|
|
---------------
|
|
|
|
The `Valgrind Quick Start
|
|
Guide <http://www.valgrind.org/docs/manual/quick-start.html>`__ is short
|
|
and worth reading. The `User
|
|
Manual <https://valgrind.org/docs/manual/manual.html>`__ is also useful.
|
|
|
|
If Valgrind asserts, crashes, doesn't do what you expect, or otherwise
|
|
acts up, first of all read this page and make sure you have both Firefox
|
|
and Valgrind correctly configured. If that's all OK, try using the
|
|
`Valgrind trunk from
|
|
SVN <http://www.valgrind.org/downloads/repository.html>`__. Oftentimes
|
|
bugs are fixed in the trunk before most users fall across them. If that
|
|
doesn't help, consider `filing a bug
|
|
report <http://www.valgrind.org/support/bug_reports.html>`__, and/or
|
|
mailing Julian Seward or Nick Nethercote.
|