最近在解决项目问题的过程中,发现编译部分存在内存泄漏。找了许久都没找到泄漏的点,最近通过一种方法有了一点进展。
使用(方法一)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);
}
******************************************************************************************************************************************************************************