![[LWN Logo]](/images/lcorner.png) |
|
![[LWN.net]](/images/Included.png) |
From: Julian Seward <Julian_Seward@muraroa.demon.co.uk>
To: lwn@lwn.net
Subject: Valgrind, an open-source memory debugger for x86-linux
Date: Wed, 13 Mar 2002 16:05:11 +0000
Valgrind is a memory debugger for x86 GNU/Linux programs, which
is significantly more powerful than the open-source community
has had up to now. I attach some explainatory notes at the end
of this message. The main site for it is
http://developer.kde.org/~sewardj
Various folks in the KDE development community have been using
Valgrind to debug the KDE 3 core libraries and apps for the past
month. David Faure, of Mandrake, mentioned using it in a
recent OSNews.com interview
(http://www.osnews.com/story.php?news_id=704), and feedback from
others who have taken snapshots has been very positive.
Thanks,
Julian Seward (jseward@acm.org)
----------------------------------------------------------------
(copied from http://developer.kde.org/~sewardj)
Valgrind is a GPL'd tool to help you find memory-management problems
in your programs. When a program is run under Valgrind's supervision,
all reads and writes of memory are checked, and calls to
malloc/new/free/delete are intercepted. As a result, Valgrind can
detect problems such as:
Use of uninitialised memory
Reading/writing memory after it has been free'd
Reading/writing off the end of malloc'd blocks
Reading/writing inappropriate areas on the stack
Memory leaks -- where pointers to malloc'd blocks are lost forever
Passing of uninitialised and/or unaddressible memory to system calls
Mismatched use of malloc/new/new [] vs free/delete/delete []
Valgrind tracks each byte of memory in the original program with nine
status bits, one of which tracks addressibility of that byte, while the
other eight track the validity of the byte. As a result, it can detect
the use of single uninitialised bits, and does not report spurious errors
on bitfield operations.
You can use it to debug more or less any dynamically-linked ELF Linux x86
executable, without modification, recompilation, or anything. If you want,
Valgrind can start GDB and attach it to your program at the point(s) where
errors are detected, so that you can poke around and figure out what was
going on at the time.
Valgrind works well enough to debug KDE3 applications. It is still a work
in progress, and has some teething difficulties, which I am working through
as fast as I can. I can certainly start and run kate, konqueror, etc, from
KDE in CVS. I used to be able to see them them doing bad stuff like reading
and writing freed memory, but nowadays they are much better behaved :).
They run stably and exit cleanly, and most of the errors reported are genuine,
as far as I can tell. Update as of 21 Feb: after much invaluable feedback
and bug-fixing from the kde-core-devel crew, Valgrind can run large parts of
KDE3 without serious problems.
Full documentation is supplied, up to date as of 10 March 02. The overly-curious
may want to read detailed tech docs about how Valgrind is implemented.
To use: you need an x86 machine running Linux 2.4.X, glibc 2.2.X and XFree86 4.X.
This covers most contemporary Linux distributions. I develop it on RedHat 7.2,
so that platform, at least, should work. It has worked in the past on RedHat 6.2
and 7.1 too.
There are some limitations, the most significant of which are:
No support for threaded programs. Valgrind will abort if your program
does a clone() system call.
No support for MMX, SSE, SSE2 insns. When queried with a CPUID insn,
Valgrind claims to be a pre-MMX Pentium-133 (P54C), which sometimes
succeeds in fooling glibc and other libraries into not using MMX insns.
Support for non-POSIX signal stuff is flaky. If you stick to POSIX signals
you should be ok.