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工具查找内存泄漏,网上已有很多介绍。可参考:/qq_39478237/article/details/85239423?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161829340416780357231639%2522%252C%2522scm%2522%253A%25220713.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=yCONFIG_DEBUG_KMEMLEAK=yCONFIG_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网上介绍也很多,可参考:/zhuyong006/article/details/83089407?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161829725016780261938963%2522%252C%2522scm%2522%253A%25220713.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存在误报的几率,但可作为一个内核空间内存泄漏查找的不错的参考工具。