TH DEBUGMALLOC 2
SH NAME
showleak, malloc, mallocz, free, realloc, calloc, msize, setmalloctag,
setrealloctag, getmalloctag, getrealloctag, malloctopoolblock \- debugging memory allocator
SH SYNOPSIS
B
$LD $OFILES -ldebugmalloc
PP
B /sys/src/libdebugmalloc/showleak
I logfile
[
I v.out
]
SH DESCRIPTION
I Debugmalloc
is a variant of the standard memory allocation routines that is intended to
help debug
IR malloc -related
problems.
For function prototypes, see
IR malloc (2).
It is invoked by specifying
B -ldebugmalloc
at link time.
PP
Like the standard memory allocation routines,
I debugmalloc
is based on the
IR pool (2)
interface; the difference is that
it turns on the
BR POOL_PARANOIA ,
BR POOL_ANTAGONISM ,
and
BR POOL_LOGGING
flags, which cause the pool routines to
recheck the whole of their data structures at each call,
fill non-zeroed memory with garbage at allocation time,
fill memory with garbage at free time,
and give the allocator logging information.
PP
The effects of
B POOL_PARANOIA
and
B POOL_ANTAGONISM
are fully defined in
IR pool (2);
what is new in
I debugmalloc
is the logging facility.
If the environment variable
B MALLOCFD
is set to a positive number
corresponding to an open file descriptor,
a textual log entry is written to
that file descriptor at each call to
IR malloc ,
IR realloc ,
or
IR free .
On supported architectures, a log line containing
a stack trace will be written before the log line for each call.
Here is an example log fragment.
PP
EX
#stack 0001190a 000139be 000116b5 000133d8
poolalloc 1a350 8256 = 24d90
#stack 0001190a 000139be 000116b5 00013748
poolfree 1a350 24d90
#stack 0001190a 000139be 000116b5 00013614
poolrealloc 1a350 0 24 = 24d90
EE
PP
The log lines that are not stack traces always begin with
the function name, the value of the pool pointer,
and then their arguments.
I Poolalloc
and
I poolrealloc
also log their returned blocks.
PP
This log file can be processed by
I showleak
to produce a listing of unfreed memory blocks, sorted
by frequency of allocation.
A sample listing might look like:
PP
EX
15 * 24 bytes = 360 bytes src(0x1190a); src(0x116b5);
10 * 68 bytes = 680 bytes src(0x1190a); src(0x116b5);
5 * 40 bytes = 200 bytes src(0x1190a); src(0x116b5);
EE
PP
Each of the lines ends with a string of commands to give to
IR acid (1)
to print the stack at the time the leaked block was allocated.
If the optional program file argument is passed to
IR showleak ,
it will filter calls to
I malloc
and the pool routines
from the stack trace.
SH EXAMPLE
EX
% 8c leak.c
% 8l leak.8 -ldebugmalloc
% MALLOCFD=3 8.out >[3] mlog
% /sys/src/libdebugmalloc/showleak mlog 8.out
20 * 9 bytes = 180 bytes src(0x1354); src(0x10ff); src(0x1036);
10 * 18 bytes = 180 bytes src(0x1354); src(0x10ff); src(0x1036);
%
EE
PP
The setting of the
B POOL_PARANOIA
flag slows down the allocator substantially.
To use
I debugmalloc
without that setting, add the line
EX
sbrkmem->flags &= ~POOL_PARANOIA;
EE
near the beginning of your program.
SH SOURCE
B /sys/src/libdebugmalloc
SH SEE ALSO
IR leak (1),
IR brk (2),
IR malloc (2),
IR pool (2)
SH BUGS
PP
The stack trace can include some
false positives.
PP
Stack traces are only supported on the Intel
IR x86 .