• 内存泄漏的检测分析


     

    一.内存泄漏的介绍:

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

      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搭配错误

  • 相关阅读:
    swift把颜色转成图片
    第四篇:断路器(Hystrix)
    第三篇: 服务消费者(Feign)
    第二篇:服务消费者(RestTemplate+ribbon)
    第一篇:服务的注册与发现Eureka(Finchley版本)
    递归打印目录层次(java版)
    zuul熔断代码
    Window安装Erlang环境
    移动一根火柴使等式成立js版本(递归)
    mysql 存储过程 游标嵌套
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/4169499.html
Copyright © 2020-2023  润新知