URI: 
   DIR <- 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 *******