今天开始实战。以Test程序为例来看看如何发现memory leak。首先是以libumem方式运行程序:
//Test.cpp
int *p = (int*)malloc(50);
p = (int*)malloc(100);
free(p);
-bash-3.00$ UMEM_DEBUG=default UMEM_LOGGING=transaction LD_PRELOAD=libumem.so.1 ./Test &
-bash-3.00$ ps -ef | grep Test
jianxu1 6105 6093 0 05:08:28 pts/2 0:00 ./Test
接下来有两种方式,一是通过gcore,然后使用mdb打开core文件:
-bash-3.00$ gcore 6105
gcore: core.6105 dumped
-bash-3.00$ mdb core.6105
Loading modules: [ libumem.so.1 libc.so.1 ld.so.1 ]
>
或者直接attach到进程:
-bash-3.00$ mdb -p 6105
Loading modules: [ ld.so.1 libumem.so.1 libc.so.1 ]
>
然后要做的非常简单,使用 ::findleaks命令找出所有的memmory leaks:
> ::findleaks
CACHE LEAKED BUFCTL CALLER
0808fa90 1 0809e080 main+0×26
———————————————————————-
Total 1 buffer, 64 bytes
> 0809e080$<bufctl_audit
ADDR BUFADDR TIMESTAMP THREAD
CACHE LASTLOG CONTENTS
809e080 809cf80 d0248569f38f5 1
808fa90 806f000 0
libumem.so.1`umem_cache_alloc_debug+0x16c
libumem.so.1`umem_cache_alloc+0x15c