Linux下内存泄漏定位方法
Linux下内存泄漏可分为用户空间的内存泄漏和内核空间的内存泄漏。用户空间内存泄漏的查找方法:第一步,查找内存泄漏的应用程序。首先,写一个简单的内存泄漏程序(每秒钟泄漏4MB)umemleak.c:#include <stdio.h>#include <malloc.h>#include <unistd.h>#include <string.h>in
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查找泄漏点。
依然以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存在误报的几率,但可作为一个内核空间内存泄漏查找的不错的参考工具。
更多推荐
所有评论(0)