今天开始实战。以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工具来定位C++程序中的内存泄漏问题。通过实例展示了libumem的使用方法,包括通过gcore生成核心文件、使用mdb工具分析内存泄漏,并讲解了libumem判断内存泄漏的标准。同时,文章讨论了在复杂情况下如何分析内存泄漏的难点,如涉及虚函数和动态分配内存的情况。
最低0.47元/天 解锁文章
2383

被折叠的 条评论
为什么被折叠?



