<- Back
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 *******