Memory Leak检测工具dmalloc

今天大家都在怀疑系统可能有memory leak,于是我准备用内存检测工具测试一把,valgrind由于还要修改的source code比较多,就下了3年前曾经用过的另一个工具dmalloc,由于用过,所以信心满满 ,可惜太失望了

1:下载,最新版也是几年前的

wget http://dmalloc.com/releases/dmalloc-5.5.2.tgz

2:安装

tar zxvf dmalloc-5.5.2.tgz
cd dmalloc-5.5.2

看了一下,configure里默认是/usr/local,也就是安装之后可执行程序肯定是/usr/local/bin,库文件和头文件肯定是在/usr/local/lib和/usr/local/include,我这里偷个懒,懒得去修改过多的配置,就直接将configure里绝对路径改了,这行修改成:

ac_default_prefix=/usr

这样安装环境就变成了/usr/bin,/usr/include,/usr/lib,其实执行configure的时候也许可以指定prefix来达到一样的效果;完了之后就安装吧:

./configure
make
sudo make install

这里很奇怪的一点,这样安装是不会报错的,但是假如你按照官方文档里的说明,链接:http://dmalloc.com/docs/latest/online/dmalloc_3.html#SEC3,只要enable下面两个选项,编译就没法通过,定位了一下具体原因是链接动态库造成的:

./configure --enable-shlib --enable-threads
make

ld: libdmallocth.a(arg_check.o): relocation R_X86_64_32 against `.rodata.str1.8' can not be used when making a shared object; recompile with -fPIC
libdmallocth.a(arg_check.o): could not read symbols: Bad value
make: *** [libdmallocth.so] Error 1
make: *** Waiting for unfinished jobs....

这里先就不enable这两个选项,还是按照上面成功的继续进行

3:环境配置

首先根据官方文档说明http://dmalloc.com/docs/latest/online/dmalloc_4.html#SEC4,原话是第四条:

To get the dmalloc utility to work you need to add an alias for dmalloc to your shell’s runtime configuration file if supported. The idea is to have the shell capture the dmalloc program’s output and adjust the environment.

也就说要告诉shell抓取dmalloc执行的输出,那就照做

vim .bashrc
function dmalloc { eval `command dmalloc -b $*`; }
source .bashrc

在这里,官方还有个说明:If your shell does not support the command function then try,也就是如果不支持command,用下面命令,这里就直接指定绝对路径得了,我这里已经改成/usr/bin了,如果是默认的话,修改成/usr/local/bin

vim .bashrc
function dmalloc { eval `/usr/bin/dmalloc -b $*`; }
source .bashrc

4:编辑C程序,这里就随便搞一个

官方表示还弄个ifdef还确定,不用这么罗哩罗嗦的,堆coredump就行,反正我头文件已经到了include下

#include <stdio.h>
#include <dmalloc.h>

int main(){
    char *ch;
    ch = (char *)malloc(sizeof(char));
    return 0;
}

5:编译

cc -DDMALLOC -DDMALLOC_FUNC_CHECK why.c -ldmalloc

6:指定信息保存文件,目录

官方原话是:Enable the debugging features by typing dmalloc -l logfile -i 100 low (for example). You should not see any messages printed by the dmalloc utility (see NOTE below),也就是将报错信息给存在logfile里,执行就是了

dmalloc -l logfile -i 100 low 

7:执行

我记得以前弄到这一步,执行,内存问题就会记录在logfile里,可是今天不争气的是,文件为空

[lihui@localhost ~]$ ./a.out 
Segmentation fault (core dumped)

[lihui@localhost ~]$ ll logfile 
-rw-rw-r--. 1 juyun juyun 0 Jan 28 23:56 logfile

 

一下子还真没找到原因……文件缓冲区?ulimit设置?还是操作次序有问题?找到问题再补充……

发表回复