首页 > 代码库 > 内存泄漏的检测分析

内存泄漏的检测分析

 

一.内存泄漏的介绍:

  • 内存泄漏以发生的方式来分类,内存泄漏可以分为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.下载

    • 在 [WWW] 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在线帮助手册 [WWW] 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搭配错误

内存泄漏的检测分析