dmalloc--查usr space内存泄露


1. 内存泄漏排查

  1. 如果发现程序运行过程,meminfo里的Memfree有不断的减少,echo 3 > /proc/sys/vm/drop_cache也不会返回内存,大概率是有内存泄露。

  2. 在排除kernel space内存泄露的前提下,试试隔段时间观察cat /proc/PID/smap里每个so的堆。有一定机率能发现是哪个so内存泄露。

  3. 如果想要准确的定位内存泄露,可以使用dmalloc工具。


2. 交叉编译

  1. http://dmalloc.com/ 上下载dmalloc-5.5.2.gz,解压。修改configure文件,把ac_cv_page_size=0 改成 ac_cv_page_size=12

  2. ./configure --prefix=/home/cbm/workplace/dmalloc/output/ --exec-prefix=/home/cbm/workplace/dmalloc/output/CC=arm-buildroot-linux-uclibcgnueabihf-gcc --host=arm-linux CXX=arm-buildroot-linux-uclibcgnueabihf-g++ AR=arm-buildroot-linux-uclibcgnueabihf-ar LD=arm-buildroot-linux-uclibcgnueabihf-ld --enable-threads --enable-shlib

  3. 由于auto脚本对交叉编译支持不够完善,所生成的Makefile有少数命令需替换,如ld-G,ar cr。改成$(LD) -G 和 $(AR) cr

  4. make CC=arm-buildroot-linux-uclibcgnueabihf-gcc CXX=arm-buildroot-linux-uclibcgnueabihf-g++ AR=arm-buildroot-linux-uclibcgnueabihf-ar LD=arm-buildroot-linux-uclibcgnueabihf-ld

  5. make install,即可在prefix目录生成bin include和lib。


3. 环境变量设置

dmalloc工具进行环境变量设置,如:dmalloc -l /tmp/dmalloc.log all,即输出所有信息并存入dmalloc.log文件;

# dmalloc -l /tmp/dm.log all

DMALLOC_OPTIONS=debug=0xcf4ed2b,log=/tmp/dm.log `

export DMALLOC_OPTIONS `

4. 库的应用

  1. 在主代码中添加#include <dmalloc.h>

  2. 更改Makefile,添加CFLAGS += -Iinclude LDFLAGS += -L$(TOP)/dmalloc -ldmalloc

  3. 重新build需要detect的应用


5. Leak检测

  1. 通过dmalloc所生产的变量DMALLOC_OPTIONS,手动或自动export到系统中

  2. 执行需detect的应用

  3. 查看变量DMALLOC_OPTIONS中所定义的导出文件内容

  4. 退出需detect的应用

  5. 查看变量DMALLOC_OPTIONS中所定义的导出文件内容

  6. 上述过程所查看的导出文件存在“not freed:”字串,则为leak点