We have been using dmalloc
as part of our tools set to verify that our core libraries are free of memory leaks. However, recently we have discovered that using printf
or fgetc
would cause dmalloc to throw the following warnings in dmalloc.log.
not freed: '0x7f2e20d36808|s1' (1182 bytes) from 'unknown'
To demonstrate the issue, below is a very simple program that we have used to reproduce the errors:
#include <stdio.h>
#include <stdlib.h>
#include "dmalloc.h"
void main() {
dmalloc_debug_setup("log-stats,log-non-free,check-fence,log=dmalloc.log");
printf("Hello World\n");
fgetc(stdin);
}
Compile the program with:
gcc test.c -ldmalloc -g -o test
Run and I get the following results:
1630587465: 2: Dmalloc version '5.5.2' from 'http://dmalloc.com/'
1630587465: 2: flags = 0x403, logfile 'dmalloc.log'
1630587465: 2: interval = 0, addr = 0, seen # = 0, limit = 0
1630587465: 2: threads enabled, lock-on = 0, lock-init = 2
1630587465: 2: starting time = 1630587464
1630587465: 2: process pid = 2079
1630587465: 2: Dumping Chunk Statistics:
1630587465: 2: basic-block 4096 bytes, alignment 8 bytes
1630587465: 2: heap address range: 0x7f343a6e0000 to 0x7f343a712000, 204800 bytes
1630587465: 2: user blocks: 4 blocks, 8192 bytes (33%)
1630587465: 2: admin blocks: 2 blocks, 8192 bytes (33%)
1630587465: 2: total blocks: 6 blocks, 24576 bytes
1630587465: 2: heap checked 0
1630587465: 2: alloc calls: malloc 2, calloc 0, realloc 0, free 0
1630587465: 2: alloc calls: recalloc 0, memalign 0, posix_memalign 0, valloc 0
1630587465: 2: alloc calls: new 0, delete 0
1630587465: 2: current memory in use: 8192 bytes (2 pnts)
1630587465: 2: total memory allocated: 8192 bytes (2 pnts)
1630587465: 2: max in use at one time: 8192 bytes (2 pnts)
1630587465: 2: max alloced with 1 call: 4096 bytes
1630587465: 2: max unused memory space: 8192 bytes (50%)
1630587465: 2: top 10 allocations:
1630587465: 2: total-size count in-use-size count source
1630587465: 2: 0 0 0 0 Total of 0
1630587465: 2: Dumping Not-Freed Pointers Changed Since Start:
1630587465: 2: not freed: '0x7f343a6f0008|s1' (4096 bytes) from 'unknown'
1630587465: 2: not freed: '0x7f343a710008|s1' (4096 bytes) from 'unknown'
1630587465: 2: total-size count source
1630587465: 2: 0 0 Total of 0
1630587465: 2: ending time = 1630587465, elapsed since start = 0:00:01
Remove the fgetc
I got only one warning with memory not being freed.
1630587578: 1: Dumping Not-Freed Pointers Changed Since Start:
1630587578: 1: not freed: '0x7f939f4e0008|s1' (4096 bytes) from 'unknown'
1630587578: 1: total-size count source
1630587578: 1: 0 0 Total of 0
Remove the printf
then I got:
1630587655: 0: Dumping Not-Freed Pointers Changed Since Start:
1630587655: 0: memory table is empty
1630587655: 0: ending time = 1630587655, elapsed since start = 0:00:00
The gcc
version being used here is 9.3.0 and the dmalloc is 5.5.2 which comes with most latest Linux distros when install using their package manager.
Can anyone experienced with dmalloc
help to point me out if this is a known problems with dmalloc
or I'm missing some obvious settings here?
Update
- This is also observed when compiled with
g++
. - Some people have pointed out that the library 5.5.2 is quite old. I have build the latest version 5.6.5 and test with gcc 11.2.0 and the problem still persists.
1630589888: 2: Dmalloc version '5.6.5' from 'http://dmalloc.com/'
1630589888: 2: flags = 0x403, logfile 'dmalloc.log'
1630589888: 2: interval = 0, addr = 0x0, seen # = 0, limit = 0
1630589888: 2: starting time = 1630589886
1630589888: 2: process pid = 11185
1630589888: 2: Dumping Chunk Statistics:
1630589888: 2: basic-block 4096 bytes, alignment 8 bytes
1630589888: 2: heap address range: 0x7ff82bd98000 to 0x7ff82bd9b000, 12288 bytes
1630589888: 2: user blocks: 1 blocks, 2048 bytes (16%)
1630589888: 2: admin blocks: 2 blocks, 8192 bytes (67%)
1630589888: 2: total blocks: 3 blocks, 12288 bytes
1630589888: 2: heap checked 0
1630589888: 2: alloc calls: malloc 2, calloc 0, realloc 0, free 0
1630589888: 2: alloc calls: recalloc 0, memalign 0, valloc 0
1630589888: 2: alloc calls: new 0, delete 0
1630589888: 2: current memory in use: 2048 bytes (2 pnts)
1630589888: 2: total memory allocated: 2048 bytes (2 pnts)
1630589888: 2: max in use at one time: 2048 bytes (2 pnts)
1630589888: 2: max alloced with 1 call: 1024 bytes
1630589888: 2: max unused memory space: 2048 bytes (50%)
1630589888: 2: top 10 allocations:
1630589888: 2: total-size count in-use-size count source
1630589888: 2: 0 0 0 0 Total of 0
1630589888: 2: Dumping Not-Freed Pointers Changed Since Start:
1630589888: 2: not freed: '0x7ff82bd9a008|s1' (1024 bytes) from 'unknown'
1630589888: 2: not freed: '0x7ff82bd9a808|s1' (1024 bytes) from 'unknown'
1630589888: 2: total-size count source
1630589888: 2: 0 0 Total of 0
1630589888: 2: ending time = 1630589888, elapsed since start = 0:00:02
- Added link to a issue raised with dmalloc. See here