Valgrind

Valgrind is a flexible system for debugging and profiling Linux executables for x86_64 (and some other) architectures. The functionality of Valgrind covers :

  • Memcheck/Addrcheck: Detection of memory-management problems
  • Cachegrind: Cache profiler. Detailed simulation of the I1, D1 and L2 caches is provided to pinpoint the sources of cache misses.
  • Callgrind: adds call graph tracing to cachegrind. It can be used to get call counts and inclusive cost for each call happening in your program. In addition to cachegrind, callgrind can annotate threads separately, and every instruction of disassembler output of your program with the number of instructions executed and cache misses incurred.
  • Massif: Memory consumption profiling.
  • Helgrind: Identify data races in multithreaded programs

Check for available version :

$ module avail perf/valgrind

Load the software, from login nodes (mesologin1, mesologin2) :

$ module load perf/valgrind

Which will provide suitable environment settings for using Valgrind.

For most cases, Valgrind will run your program considerably slower than usual, and also may use more resources, so it is recommended to cut down on problem sizes for profiling.

A number of example programs are available valgrind_examples.tar, which illustrate the various usage possibilities. The archive contains the following files

  • A Makefile for building the examples. It also contains targets illustrating the call parameters you need to specify for each case
  • Examples for Memcheck functionality: Fortran programs (leak1.f90) with and (noleak1.f90) without memory leaks, respectively.
  • Example for memory profiling (heap1.f90)
  • Example for cache profiling (cache1.f90). This includes a dummy routine which prevents the compiler from optimizing away the loop.

Memcheck tool

$ valgrind --tool=memcheck --leak-check=yes --show-reachable=yes ./leak1.exe

Massif tool

$ valgrind --tool=massif  --depth=5  ./heap1.exe

Cachegrind tool

$ valgrind --tool=cachegrind  ./cache1.exe

Callgrind tool

$ valgrind --tool=callgrind  ./heap1.exe
 
$ callgrind_annotate --tree=both --auto=yes callgrind.out*

One can visualize the call graphs with Kcachedgrind