DEBUGMALLOC(2) DEBUGMALLOC(2) NAME showleak, malloc, mallocz, free, realloc, calloc, msize, setmalloctag, setrealloctag, getmalloctag, getrealloctag, malloctopoolblock - debugging memory allocator SYNOPSIS $LD $OFILES -ldebugmalloc /sys/src/libdebugmalloc/showleak logfile [ v.out ] DESCRIPTION Debugmalloc is a variant of the standard memory allocation routines that is intended to help debug malloc-related prob- lems. For function prototypes, see malloc(2). It is invoked by specifying -ldebugmalloc at link time. Like the standard memory allocation routines, debugmalloc is based on the pool(2) interface; the difference is that it turns on the POOL_PARANOIA, POOL_ANTAGONISM, and POOL_LOGGING flags, which cause the pool routines to recheck the whole of their data structures at each call, fill non- zeroed memory with garbage at allocation time, fill memory with garbage at free time, and give the allocator logging information. The effects of POOL_PARANOIA and POOL_ANTAGONISM are fully defined in pool(2); what is new in debugmalloc is the log- ging facility. If the environment variable MALLOCFD is set to a positive number corresponding to an open file descrip- tor, a textual log entry is written to that file descriptor at each call to malloc, realloc, or free. On supported architectures, a log line containing a stack trace will be written before the log line for each call. Here is an exam- ple log fragment. #stack 0001190a 000139be 000116b5 000133d8 poolalloc 1a350 8256 = 24d90 #stack 0001190a 000139be 000116b5 00013748 poolfree 1a350 24d90 #stack 0001190a 000139be 000116b5 00013614 poolrealloc 1a350 0 24 = 24d90 The log lines that are not stack traces always begin with the function name, the value of the pool pointer, and then their arguments. Poolalloc and poolrealloc also log their returned blocks. This log file can be processed by showleak to produce a listing of unfreed memory blocks, sorted by frequency of allocation. A sample listing might look like: Page 1 Plan 9 (printed 4/20/24) DEBUGMALLOC(2) DEBUGMALLOC(2) 15 * 24 bytes = 360 bytes src(0x1190a); src(0x116b5); 10 * 68 bytes = 680 bytes src(0x1190a); src(0x116b5); 5 * 40 bytes = 200 bytes src(0x1190a); src(0x116b5); Each of the lines ends with a string of commands to give to acid(1) to print the stack at the time the leaked block was allocated. If the optional program file argument is passed to showleak, it will filter calls to malloc and the pool routines from the stack trace. EXAMPLE % 8c leak.c % 8l leak.8 -ldebugmalloc % MALLOCFD=3 8.out >[3] mlog % /sys/src/libdebugmalloc/showleak mlog 8.out 20 * 9 bytes = 180 bytes src(0x1354); src(0x10ff); src(0x1036); 10 * 18 bytes = 180 bytes src(0x1354); src(0x10ff); src(0x1036); % The setting of the POOL_PARANOIA flag slows down the alloca- tor substantially. To use debugmalloc without that setting, add the line sbrkmem->flags &= ~POOL_PARANOIA; near the beginning of your program. SOURCE /sys/src/libdebugmalloc SEE ALSO leak(1), brk(2), malloc(2), pool(2) BUGS The stack trace can include some false positives. Stack traces are only supported on the Intel x86. Page 2 Plan 9 (printed 4/20/24)