Chapter 22. Valgrind
Valgrind is an instrumentation framework for building dynamic analysis tools that can be used to profile applications in detail. The default installation already provides five standard tools. Valgrind tools are generally used to investigate memory management and threading problems. Valgrind provides instrumentation for user-space binaries to check for errors, such as the use of uninitialized memory, improper allocation/freeing of memory, and improper arguments for system calls. Its profiling tools can be used on most binaries; however, compared to other profilers, Valgrind profile runs are significantly slower. To profile a binary, Valgrind runs it inside a special virtual machine, which allows Valgrind to intercept all of the binary instructions. Valgrind's tools are most useful for looking for memory-related issues in user-space programs; it is not suitable for debugging time-specific issues or kernel-space instrumentation and debugging.
Valgrind reports are most useful and accurate when debuginfo packages are installed for the programs or libraries under investigation. See Section 20.1, “Enabling Debugging with Debugging Information”.
22.1. Valgrind Tools
The Valgrind suite is composed of the following tools:
- memcheck
This tool detects memory management problems in programs:
- By checking all reads from and writes to memory
-
By intercepting memory manipulations like calls to
malloc
,free
,new
ordelete
memcheck is perhaps the most used Valgrind tool, as memory management problems can be difficult to detect using other means. Such problems often remain undetected for long periods, eventually causing crashes that are difficult to diagnose.
memcheck functions as the default tool when no specific tool is selected.
- cachegrind
- cachegrind is a cache profiler that accurately pinpoints sources of cache misses in code by performing a detailed simulation of the I1, D1 and L2 caches in the CPU. It shows the number of cache misses, memory references, and instructions accruing to each line of source code; cachegrind also provides per-function, per-module, and whole-program summaries, and can even show counts for each individual machine instructions.
- callgrind
-
Like
cachegrind
,callgrind
can model cache behavior. However, the main purpose ofcallgrind
is to record callgraphs data for the executed code. - massif
- massif is a heap profiler; it measures how much heap memory a program uses, providing information on heap blocks, heap administration overheads, and stack sizes. Heap profilers are useful in finding ways to reduce heap memory usage. On systems that use virtual memory, programs with optimized heap memory usage are less likely to run out of memory, and may be faster as they require less paging.
- helgrind
In programs that use the POSIX pthreads threading primitives, helgrind detects synchronization errors. Such errors are:
- Misuses of the POSIX pthreads API
- Potential deadlocks arising from lock ordering problems
- Data races (that is, accessing memory without adequate locking)
22.2. Using Valgrind
The valgrind package and its dependencies install all the necessary tools for performing a Valgrind profile run. To profile a program with Valgrind, use:
$ valgrind --tool=toolname program
See Section 22.1, “Valgrind Tools” for a list of arguments for toolname
. In addition to the suite of Valgrind tools, none
is also a valid argument for toolname
; this argument allows you to run a program under Valgrind without performing any profiling. This is useful for debugging or benchmarking Valgrind itself.
You can also instruct Valgrind to send all of its information to a specific file. To do so, use the option --log-file=filename
. For example, to check the memory usage of the executable file hello
and send profile information to output
, use:
$ valgrind --tool=memcheck --log-file=output hello
See Section 22.3, “Additional information” for more information on Valgrind, along with other available documentation on the Valgrind suite of tools.
22.3. Additional information
For more extensive information on Valgrind, see man valgrind
. Red Hat Enterprise Linux also provides a comprehensive Valgrind Documentation book available as PDF and HTML in:
-
/usr/share/doc/valgrind-version/valgrind_manual.pdf
-
/usr/share/doc/valgrind-version/html/index.html