forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			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.
 | 
