Linux下内存泄漏可分为用户空间的内存泄漏和内核空间的内存泄漏。

用户空间内存泄漏的查找方法:

    第一步,查找内存泄漏的应用程序。

    首先,写一个简单的内存泄漏程序(每秒钟泄漏4MB)umemleak.c:

#include <stdio.h>
#include <malloc.h>
#include <unistd.h>
#include <string.h>

int main()
{
	char *ptr = NULL;
	while(1){
		ptr =(char *)malloc(sizeof(char) * 4*1024*1024);
		memset(ptr, 'a', sizeof(char) * 4*1024*1024);
		sleep(1);
	}

	return 0;
}

编译:gcc umemleak.c -o umemleak

执行:./umemleak

另外打开一个终端,输入命令top,按Shift+M(以内存占用列排序)

    说明:假设在不知道哪个程序存在内存泄漏的情况下,通过 终端输入命令top,按Shift+M(以内存占用列排序),一段时间后,内存不断增长的应用程序,便可能是存在内存泄漏的应用程序。倘若任其内存泄漏,最终在耗尽系统内存时,该应用必然会被系统所杀死,泄漏掉的内存也会被系统所回收。系统中也就不存在这个进程了(除非设置了自动重启动)。

    第二步,进入找到的内存泄漏应用程序源码,利用valgrind查找泄漏点。

    关于valgrind工具查找内存泄漏,网上已有很多介绍。可参考:https://blog.csdn.net/qq_39478237/article/details/85239423?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161829340416780357231639%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=161829340416780357231639&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~rank_v29-4-85239423.pc_search_result_cache&utm_term=Linux%E5%86%85%E5%AD%98%E6%B3%84%E6%BC%8F%E7%9A%84%E5%AF%BB%E6%89%BE

    依然以umemleak.c为例,编译时加入 -g 调试选项:

    gcc -g umemleak.c -o umemleak

    执行:valgrind --tool=memcheck --leak-check=full --show-reachable=yes --trace-children=yes ./umemleak

    即使是大型应用程序,通过以上的步骤,也一样可以找出内存泄漏的位置。

 

 

内核空间内存泄漏的查找方法:

    1. 在内核参数bootarg中加入"kmemleak=on"

    2. 在.config中做如下配置:

CONFIG_HAVE_DEBUG_KMEMLEAK=y
CONFIG_DEBUG_KMEMLEAK=y
CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE=800

    3. 挂载:mount -t debugfs none /sys/kernel/debug

    如果一切顺利的话,你将能够在"/sys/kernel/debug/"下面看到kmemleak的文件。输入如下命令,让系统去检测内存泄露:

    echo scan > /sys/kernel/debug/kmemleak

    随后输入如下命令,查看系统检测到的内存泄露结果:

    cat /sys/kernel/debug/kmemleak

    kmemleak网上介绍也很多,可参考:https://blog.csdn.net/zhuyong006/article/details/83089407?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161829725016780261938963%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=161829725016780261938963&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~rank_v29-1-83089407.pc_search_result_cache&utm_term=kmemleak+release%E7%89%88%E6%9C%AC

    注:kmemleak存在误报的几率,但可作为一个内核空间内存泄漏查找的不错的参考工具。

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐