首页 > 代码库 > 内存泄漏的检测分析
内存泄漏的检测分析
一.内存泄漏的介绍:
内存泄漏以发生的方式来分类,内存泄漏可以分为4类:
1.常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。
2.偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。
3.一次性内存泄漏。发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块仅且一块内存发生泄漏。
二.C程序内存泄漏和其它内存常见错误及例子
1.测试malloc之后没有free引起的内存泄漏
2.指针访问越界
##############Explame1###########################
p = (char *)malloc(10);
p[24] = ‘0‘; free(p);
#################################################
3.两次对同一个地址使用free()
##############Explame1###########################
char *p = NULL;
char *q = NULL; p = (char *)malloc( 2 ); free(p); free(p); 可以检测出这一行 free(p+2)这样写也可以检测出 free(q); 不能检测出
#################################################
4.让未初始化数据作为赋值量
##############Explame1###########################
int n,m;
m = n;
#################################################
5.将未初始化值作为判断条件
##############Explame1###########################
int n; if(n){
n++;
}
#################################################
6.memcpy引起的内存重叠
##############Explame1###########################
char szStr[10];
memcpy(szStr,szStr+3,6);
#################################################
7.栈溢出
##############Explame1###########################
fun(){
fun();
} main(){
fun();
}
#################################################
8.new , delete , malloc free 搭配错误
##############Explame1###########################
char *p = (char *)malloc(2);
delete p;
#################################################
三.Linux下内存检测方法介绍
1.确定要检查的范围。
确定要对哪些内存错误进行检测。基本上都是上面提到的内存错误。
2.使用内存检测工具对程序进行检测
目前我们使用了Linux下的开源工具Valgrind 进行内存泄漏和各种工具的检测,类似的工具,都是要求再程序在GCC编译时加入-g参数,然后可以动态分析程序的内存分配情况,和各种内存错误。使用一般得到得结果为。(1)错误类型(2)错误所在文件(3)错误所在行。
3.深入源代码进行错误得分析和猜测。
根据工具得到得错误提示深入源代码进行错误得分析。找到程序自身代码的最底一层调用。
四.Valgrind 工具介绍
1.简介
Valgrind是在Linux下对程序进行分析和调试得一个工具级,可以自动检测内存管理得漏洞,避免系统崩溃,使程序更佳稳定,也可以对程序进行详细分析,优化代码,减少对内存资源的使用。
2.下载
在 http://www.valgrind.org/downloads/current.html 上可以免费得到最新版本的Valgrind
3.安装
(1)将Valgrind包拷贝到自己的目录下valgrind-3.1.1.tar.bz2 (2)解压 tar -jxvf valgrind-3.1.1.tar.bz2 得到目录valgrind-3.1.0 (3)进入valgrind-3.1.0目录,依次执行
./configure make make install
(4)安装完毕
4.使用Valgrind
(1)对被测程序的要求
要求用GCC编译时使用-g选项
例如对test.c程序进行编译:gcc -o test -g test.c
(2)基本用法:
valgrind [option] exefile arg...
[option]:参数选项
exefile:可执行程序
arg...:程序参数
(3)使用内存检测
option参数必须加上--leak-check=yes
举例:以程序test为例
检查test程序的内存错误:valgrind --leak-check=yes ./test
(4)常用参数说明
--show-reachable=no 只当指针完全丢失时提示 =yes 只要没有释放的指针都提示
-v 得到更相信的错误统计信息
--log-file-exactly=[logfile] 将valgrind信息存入logfile文件,如果没有这个项都是显示在屏幕上
(5)举例:测试test程序的内存问题并把结果存入log文件
valgrind --leak-check=yes --show-reachable=yes -v --log-file-exactly=log ./test
(6)详细参数说明见valgrind在线帮助手册 http://www.valgrind.org/docs/manual/mc-manual.html
5.Vallog可以识别的错误及错误提示
1.malloc/free: in use at exit 内存在退出前没有被释放
2.Invalid write of size 非法写内存:一般为数组越界
3.Invalid read of size 非法读内存:一般为数组越界
4.definitely lost/possibly lost/still reachable in loss record 内存未释放
5.Invalid free() / delete / delete[] 同一指针被多次释放
6.Source and destination overlap 内存重叠(一般是使用strncpy,memcpy引起)
7.Syscall param contains uninitialised byte 调用系统函数时传入了未初始化的变量
8.Conditional jump or move depends on uninitialised value 条件判断时使用了未初始化的变量
9.栈溢出Access not within mapped region/Stack overflow 栈溢出
10.Mismatched free() / delete / delete [] new--delete malloc--free搭配错误
内存泄漏的检测分析