njamdpm - Not Just Another Malloc Debugger Post-Mortem
SYNOPSIS
njamdpm [OPTIONS] <HEAP FILE>
DESCRIPTION
njamdpm is a companion utility that allows you to examine
the persistent heap saved by libnjamd(3) You can do things
like query for certain addresses, show memory leaks, and
show all past allocated memory. As of NJAMD 0.6.0, gdb(1)
is required to make sense of the return addresses.
USAGE
Options
HEAP FILE
The heap file will be in the current directory with
a name of the form njamd-<pid>-heap, but only if
NJAMD_PERSISTANT_HEAP was in the environment at the
time of program execution
-a address
Search through the heap file for a chunk of memory
that contains address. This can be VERY helpful
when using gdb. Simply find the address that you
accessed to cause the segmentation fault, use
njamdpm to look it up in the heap, and viola! You
have all sorts of info about the chunk: When it was
allocated, when it was freed, how big is is, etc.
-d depth
When displaying return address info, only display
depth return addresses. The max is specified in
./include/lib/njamd.h in the define TRACE_DEPTH
(default is 3).
-t Trim the heap file down to only the used portion.
This is useful if for some reason the program some
how exits without trimming its own heap file down
first. Note that when the heap file appears huge
it's not actually taking up disk space.
-s Dump basic status info about peak memory usage,
NJAMD overhead, etc. Useful for determining if you
should buy more ram, or write me an angry email :)
-l Dump memory leaks in the heap. Also shows you info
about where the memory was leaked, along with a
total. Do note that this total and the subtotals
are aligned bytes. They are aligned to the align
ment of your architecture, or as specified by the
value the NJAMD_ALIGN environment variable had when
the heap was created.
available if LIBNJAMD ran without
NJAMD_CHK_FREE=none set.
Using gdb with njamdpm
When a segmentation fault happens, it's because, of
course, you accessed an invalid address. So all you need
to do is get gdb to give you the address you accessed, and
then feed it to njamdpm. Ie if the segfault occurs on a
line that does buf[i] = 2, issue print &buf[i] to gdb.
Note that libnjamd(3) now has a function __nj_ptr_info
that can be called from gdb that performs all this without
njamdpm.
To get gdb to translate these return addresses into some
thing meaningful, issue
info line *0xaddress
to obtain the line number of the allocation request, or
list *0xaddress
to see the adjacent code as well.
NOTES
Eventually I hope to add symbol translation right into
njamdpm.
AUTHORS
Mike Perry <mikepery@fscked.org>
SEE ALSO
http://freshmeat.net/appindex/development/debugging.html
njamd(3), efence(3), malloc(3), mmap(2), mprotect(2)
Man(1) output converted with
man2html