【内存泄漏】- 1. 内存泄漏概念与测试工具介绍

版权声明:欢迎交流 https://blog.csdn.net/sishuihuahua/article/details/84726921

序言:

2018年5月的时候,因为工作需要专门去研究了内存泄漏。主要是要去检测Linux c项目代码以及python代码。对Linux c的内存泄漏检测可能还比较熟悉,但是对脚本语言python进行内存泄漏的测试,我一开始表示完全不知情,随着查找资料,才逐渐明朗。所以这个内存泄漏版块,主要为了记录一下当时是如何选择工具,为什么选择这个工具,如何使用这个工具,效果怎么样。

 

一、 内存泄漏的概念

        内存泄露是指程序运行期间动态分配了内存,但是在程序结束时没有释放这部分内存,从而造成那一部分内存不可用的情况。一般重启计算机可以解决,但可能再次发生内存泄露。内存泄露和硬件没有关系,它是由软件设计缺陷引起的。

按发生的方式来分类,内存泄漏可以分为4 类:

  • 常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。
  • 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。
  • 一次性内存泄漏。发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块且仅有一块内存发生泄漏。比如,在类的构造函数中分配内存,在析构函数中却没有释放该内存,此时内存泄漏只会发生一次。
  • 隐式内存泄漏。程序在运行过程中不停地分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏。

二、 检查内存泄漏的方法

  1. 压力测试:如对一个HTTP应用进行压力测试,经常发现被测试对象进程在并发时内存占用不合理。此时常用方式为LoadRunner施压结合响应时间的曲线图来监控。内存泄漏问题多半在压力测试中出现,也是源于程序编写过程中没有规范化管理所导致,开发人员可结合内存监测工具来有效监控自己的程序。
  2. 测试工具:利用市面上专门检测内存泄漏的测试工具(具体根据语言的不同,相应的测试工具也不尽相同)。此时,涉及静态分析技术(直接分析程序的源代码)和源代码插装技术(在保持被测程序的逻辑完整性的基础上,在被测程序的特定部位插入一段检测程序,又称探针函数,(通过探针的执行抛出程序的运行特征数据)。
  3. 白盒测试(人工设置断点查看):首先得根据具体语言如c,python等充分了解什么情况下会造成内存泄漏。再一一根据这些具体条件测试是否存在内存泄漏问题。比如C语言,C语言内存的泄漏,是通过malloc、calloc等函数申请的内存没释放,因此内存泄漏的检测方法核心思想就是,通过宏自定义分配及释放函数来替换用户的malloc、calloc、free等函数。设计数据结构记录内存申请信息。申请内存时,记录并插入到全局的链表中。释放内存时从全局链表中查找对应的记录,并删除。程序结束时,将链表中信息写入文件,清除链表。只要在分配内存和释放内存时分别做好记录,程序结束时对比分配内存和释放内存的记录就可以确定是不是有内存泄漏。

三、 检测内存泄露的工具

1. 内存泄露检测工具支持

          Visual C++平台开发,用Numega的BoundsChecker(该方法没有实践过)

          Linux平台 开源工具valgrind(后面有一个详细讲解使用valgrind检查python内存泄露的例子)

2. 静态分析技术

          Klocwork的K7

          Coverity的SQS

          C++test的BugDetective

          LCLink

          ccmalloc-Linux和Solaris下对C和C++程序的简单的使用内存泄漏和malloc调试库

          Leaky-Linux下检测内存泄漏的程序

          Cppcheck(后面会详细讲解)

3. 动态分析技术

          Python的gc模块+pyrasite模块检查python程序内存泄露(后面会详细讲解)

          tracemalloc 检测python内存泄露

四、Jenkins

        当时所接触到测试,需要编写测试用例,最终实现的效果是实现自动化测试。所以就需要集成的测试环境平台,可以实现自动构建,自动运行,最终以图形化的形式显示测试结果。所以Jenkins是个不错的选择。

Jenkins的安装与搭建过程都差不多一样,请参考博客:

https://blog.csdn.net/qq_26848099/article/details/78901240

下面贴上几张在Jenkins上实现的自动化测试的一个效果图:

后续还会更新:

【内存泄漏】- 2. 使用cppcheck+Jenkins检测c、c++内存泄漏

【内存泄漏】- 3. 使用splint检测c、c++内存泄漏

【内存泄漏】- 4. 使用python的gc+pyrasite模块检测python内存泄漏

【内存泄漏】- 5. 使用Valgrind工具检测Python内存泄漏

 

 

猜你喜欢

转载自blog.csdn.net/sishuihuahua/article/details/84726921