NAME
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 (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 somehow 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
alignment of your architecture, or as specified by the value the
NJAMD_ALIGN environment variable had when the heap was
created.
- -f
- Dump freed memory in the heap. This option is only 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
(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 something
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 <
SEE ALSO
(3),
(3),
(3),
(2),
(2)