|
How to enable MALLOC_STATS in OpenBSD's libc
============================================
If you want to write sane programs in C, it's a good idea to check your
program for memory leaks. OpenBSD's libc covers a neat method for
thisendeavor. But it's not enabled by default.
It can be enabled by recompiling libc after commenting in one line of
code.
You'll have to recursively fetch the libc part of the OpenBSD
source-tree. To begin with, you should add your user to the groups wsrc
and wobj.
# useradd -G wsrc,wobj $USER
You can apply these changes by logging in again with your user. The
following just works within the shell it's run on.
# su - $USER
After this is done you will have to write access to the directory /usr/src
(and /usr/obj).
Change directory to /usr/src and fetch OpenBSD's source via cvs.
$ cd /usr
$ cvs -qd anoncvs@anoncvs.ca.openbsd.org:/cvs get -rOPENBSD_6_1 -P
src/lib/libc
This may take a while.
Afterwards you'll have to edit malloc.c.
$ vi /usr/src/lib/libc/stdlib/malloc.c
find this line and remove the commenting:
/* #define MALLOC_STATS */
It should be around line 26.
Next you have to compile libc. This needs to be done from the
folder/usr/src/lib/libc.
$ cd /usr/src/lib/libc
$ make obj
$ make depend
$ make
$ make install
This may take a while.
On successful compilation you will rewarded with a new, modified
versionof malloc(). Programs that are now compiled with this
modifiedmalloc()-function are able to dump their stats.
In order to achieve this, you'll have to make sure the following two
things.
A writable file called malloc.out has to exist in the same directory
ofthe executable. And the program has to be called with the
environmentvariable MALLOC_OPTIONS=D set:
$ MALLOC_OPTIONS=D ./my_executable
After execution the stats will be dumped into malloc.out. The bottompart
of the dump is most interesting, since it contains the actual leakage
information.
The following is an example of one of my own programs:
******** Start dump my_executable ******* MT=0 IRC=1 F=0 U=0 J=1 R=0 X=0
C=0 cache=64 G=0 Malloc dir of my_executable pool 0 at 0x1ef309d654a0
Region slots free 507/512 Finds 74/0 Inserts 13/0 Deletes 8/0 Cheap
reallocs 0/0 In use 167936 Guarded 0 Free chunk structs:
4) 54
4) 54 chunk 0x1ef3c4c5e000 0x0 16 255/256
4) 54 chunk 0x1ef39f5fa000 0x0 16 255/256
4) 54
5) 73
5) 73
5) 73
5) 73
6) 85
6) 85
6) 85
6) 85
7) 85
7) 85
7) 85
7) 85 Free pages cached: 8
2) free at 0x1ef31c4b1000: 1 18) free at 0x1ef3e1e20000: 1 26) free at
0x1ef302d90000: 1 27) free at 0x1ef3ce263000: 1 29) free at
0x1ef32d2a8000: 1 40) free at 0x1ef3af85c000: 1 43) free at
0x1ef319cdb000: 1 53) free at 0x1ef3b6a71000: 1 slot) hash d type
page f size [free/n]
1c) # 1c 0 pages 0x1ef371d9a000 0x1ef2f0fb2bbc 65536
5d) # 5d 0 chunk 0x1ef3c4c5e000 0x0 16 255/256
a4) # a4 0 pages 0x1ef3e6c99000 0x1ef2f0fb2bbc 16384
1be) # 1be 0 chunk 0x1ef39f5fa000 0x0 16 255/256
1ff) # 1ff 0 pages 0x1ef3a7cba000 0x1ef2f0fb2bbc 16384 Leak
report
f sum # avg
0x0 32 2 16
0x1ef2f0fb2bbc 98304 3 32768
******** End dump my_executable ******* |