Valgrind Memory Check Parser
Complete:
Valgrind Memcheck produces a large output which is hard and time consuming to read through manually.
As often developers are interested in memory leaks in just a specific part of the code, scripts have been designed to filter the logs and produce an HTML output, possibly integrated with a graphical display of the leaks using graphviz.
valgrindMemcheckParser.pl (HTML output only)
The program,
valgrindMemcheckParser.pl
can be found in
Utilities/ReleaseScripts/scripts
, and can run on any lx64slc4 machine (or on whatever machine that has the needed perl modules:
CGI,
Date::Format
,
Getopt::Long
); a CSS stylesheet is also provided in the
Utilities/ReleaseScripts/data
folder to have a more readable output.
The syntax of the program is
./valgrindMemcheckParser.pl [options] logfile > outfile.html
In order to have a full list of options, just call
./valgrindMemcheckParser.pl -h | more
Filters
Filters are available both at library level (using
-l
option) and at stack trace level (using
-t
); the argument of the option is a PERL-compatible regexp that must match in order to have the leak reported.
If one instead wants to exclude from the report all leaks which match the specified regexp, it's enough to prefix the option with a minus sign. (i.e.
-t -TCint
to exclude everything which has "TCint" in the stack trace)
Multiple filters can be specified either with multiple "-t" options, or by putting the regexps separated by comas as "-t reg1,reg2,-reg3"
Presets
Filtering in or out some common patterns, like EDProducers and ESProducers, or excluding ROOT internals, might require a large number of filters, so pre-configured lists of filters are already available and callable with a simple syntax
--preset something
The list of presets can be obtained again through
./valgrindMemcheckParser.pl -h
, and it is possible to find out the list of regexps in each preset using
./valgrindMemcheckParser.pl --dump-preset name
.
Presets can be prefixed by a minus sign, to exclude any item for which at least one of the regexps match, or a plus sign to require all the regexps to match each leak.
Standard presets for CMSSW
- To look for leaks in EDProducers, including those within EventSetup:
--preset=prod
- To look for leaks in EDProducers, excluding as much as possible those from EventSetup:
--preset=prod,-prod1+
(-prod1
without the +
is an older preset which leaves some more ES stuff in)
- To get leaks from EventSetup which you excluded in the step before:
--preset=prod,prod1+
Finding other types of memory bugs
valgrindMemcheckParser.pl
can also look for other types of bugs. The type of bug to search for can be specified using a command line option (no option means look for leaks)
-
--uninitialized
or -u
: uses of uninitialized memory
-
--free
or -f
: bad uses of free()
This features are not supported in the
Linking
The output HTML page is linked to LXR; by using the
--rel
option it is possible to choose the CMSSW release appropriate for the linking.
valgrindMemcheckGraph.pl (graphical output)
This new script displays the stack traces of the memory leaks graphically as trees, using graphviz.
This can be useful when the leak of a big object causes the loss of many other ones, and thus multiple leaks: by inspecting the plot one can get hints on where the first leak was.
The stack trace elements are displayed as orange boxes if there is a leak originating in that element, otherwise they're in green; clicking on the boxes brings you to the list of stack traces where a specific element appears, and from there other links allow to see the individual stack traces as in
valgrindMemcheckParser.pl
valgrindMemcheckGraph.pl
uses much of the code of
valgrindMemcheckParser.pl
, so its usage is similar.
The notable differences are:
- instead of dumping an HTML to standard output, it writes some files to a directory specified using the
--out
command line option
if the directory is not already there, it is created by the program.
- this program can't search for uninitialized memory or bad
free()
, only for memory leaks
- if there are too many leaks passing the selection, the program could crash due to graphviz failing to produce the plot.
- you need a version of graphviz with libpng, which is not provided on lx64slc4. If you don't have one already, you can use one from my afs area with
export LD_LIBRARY_PATH=/afs/cern.ch/user/g/gpetrucc/scratch0/graphviz/lib:${LD_LIBRARY_PATH}
export PATH=/afs/cern.ch/user/g/gpetrucc/scratch0/graphviz/bin:${PATH}
(use
setenv
instead of
export
if you have
tcsh
instead of
bash
)
Review Status
Responsible:
GiovanniPetrucciani
Last reviewed by: