linux中,查找内存泄漏的方法

最近在解决项目问题的过程中,发现编译部分存在内存泄漏。找了许久都没找到泄漏的点,最近通过一种方法有了一点进展。

使用(方法一)mtrace:

#include

int main()

{

    setenv("MALLOC_TRACE",/home/root/trace.log,1);

    mtrace();

    ......

}

等程序运行之后,就会在/home/root路径下生成trace.log。

然后将执行文件compile-run和trace.log放在linux系统的同一路径下;

再使用命令mtrace compile-run trace.log 就可以显示没有释放的内存地址(addr)、大小(size)和调用者(caller);

但是可悲的是,从我的显示来看,是libc.so.6中出了内存泄漏。感觉是我搞错了的样子。还需进一步核查。

****************************************************************以下为2021-01-23更新***********************************************************************************

    其实我没有搞错,从trace.log中的记录:  /lib/libc.so.6:(_strdup + 0x10).......  来看,是因为程序中反复调用了strdup()这个字符串复制函数而没有回收内存导致的泄漏。

我是通过下面的方法二找出这个内存泄漏源的:

(方法二)通过将项目代码分块,逐块排除的方法。

    这种方法虽然比较笨,但不失为一种有效的方法。这种方法不仅适用于软件,硬件也同样适用。

(方法三) 利用valgrind --leak -check=full --show-reachable=yes -v ./compile-run ./trace.log查看具体产生内存泄漏的代码;但./compile_run必须是能在PC上运行的执行文件,才能利用valgrind得到分析结果,否则会报错说架构不对

******************************************************************************************************************************************************************************

打印系统内存的方法如下,但此种方式似乎和虚拟内存没有必然联系。因为从我的实际验证来看,当通过top指令来查看虚拟内存时,虽然VSZ%的数值没变,但通过sysinfo打印出来的数据却在变化。

#include

struct sysinfo sinfo;

void *compileRun()

{

    int err;

    err = sysinfo(&sinfo);

    DEBUG_LOG(INFO, “%d, %d”, sinfo.totalram,sinfo.freeram);

}

******************************************************************************************************************************************************************************

 

 

你可能感兴趣的:(linux)