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

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

使用(方法一)mtrace:

#include<mcheck.h>

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 <sys/sysinfo.h>

struct sysinfo sinfo;

void *compileRun()

{

    int err;

    err = sysinfo(&sinfo);

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

}

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

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值