What Valgrind does with your program
You can invoke valgrind using command
valgrind [valgrind-options] your-prog [your-prog-options]
The most important option is --tool which dictates which Valgrind tool to run. The default tool is memcheck.
Regardless of which tool is in use, Valgrind takes control of your
program before it starts. Debugging information is read from the
executable and associated libraries, so that error messages and other
outputs can be phrased in terms of source code locations, when
appropriate.
Your program is then run on a synthetic CPU provided by the
Valgrind core. As new code is executed for the first time, the core
hands the code to the selected tool. The tool adds its own
instrumentation code to this and hands the result back to the core,
which coordinates the continued execution of this instrumented
code.
First off, consider whether it might be beneficial to recompile
your application and supporting libraries with debugging info enabled
(the
-g
option). Without debugging info, the best
Valgrind tools will be able to do is guess which function a particular
piece of code belongs to, which makes both error messages and profiling
output nearly useless. With -g
, you'll get
messages which point directly to the relevant source code lines.
Another option you might like to consider, if you are working with
C++, is
-fno-inline
. That makes it easier to see the
function-call chain, which can help reduce confusion when navigating
around large C++ apps.
If you are planning to use Memcheck: On rare
occasions, compiler optimisations (at
-O2
and above, and sometimes -O1
) have been
observed to generate code which fools Memcheck into wrongly reporting
uninitialised value errors, or missing uninitialised value errors. So the best solution is to turn off optimisation altogetherMemcheck: a memory error detector
To use this tool, you may specify
--tool=memcheck
on the Valgrind command line.
It can detect the following
problems that are common in C and C++ programs.
- Accessing memory you shouldn't, e.g. overrunning and underrunning heap blocks, overrunning the top of the stack, and accessing memory after it has been freed.
- Using undefined values, i.e. values that have not been initialised, or that have been derived from other undefined values.
- Incorrect freeing of heap memory, such as double-freeing heap
blocks, or mismatched use of
malloc
/new
/new[]
versusfree
/delete
/delete[]
- Overlapping
src
anddst
pointers inmemcpy
and related functions. - Memory leaks.
No comments:
Post a Comment