几个C++内存泄漏和越界检测工具简介

shangs00 2020-01-09

一、BoundsChecker
    或许你还不知道大名顶顶的Nu-Mega,但一定听说过他们的产品SoftICE,BoundsChecker也是这家公司的产品。与Visual C++配合使用,据说威力强大。本人和没有实际用过,在此复制一下百度百科的简介,好有个简单的认识。
    BoundsChecker是一个运行时错误检测工具,它主要定位程序运行时期发生的各种错误。它通过驻留在Visual C++开发环境内部的自动处理调试程序来加速应用程序的开发,缩短产品发布时间。BoundsChecker对于编程中的错误(大多数是C++中特有的)提供了清晰的详细的分析。它能够检测和诊断出在静态,堆栈内存中的错误以及内存和资源泄漏问题。在运行状态下BoundsChecker验证超过8700APIs和OLE方法,包括最新的Windows APIs,ODBC,ActiveX,DirectX,COM和Internet APIs。
  BoundsChecker采用一种被称为Code Injection的技术,来截获分配内存和释放内存函数的调用。简单的说,当你的程序开始运行时,BoundsChecker的DLL被自动载入进程的地址空间,然后它会修改进程中分配和释放内存的函数的调用,让这些调用首先转入它的代码。BoundsChecker在做这些动作时,无需修改被调试程序的源代码或工程配置文件,这使得它使用非常的简便、直接。
  程序员在开发过程中可能会经常遇到这样的问题:调试时语法没有问题,代码也没有错误,但程序运行就是不正常甚至死机,其实这有可能是逻辑错误引起的内存溢出或资源泄露等问题。这些错误一般是不容易检测出来的。而这些错误就是BoundsChecker错误检测之一。
  通过对被测程序的操作,BoundsChecker提供详细的,清晰的错误分析;自动查明静态的堆栈错误及内存、资源泄漏,并且能够迅速定位出错的源代码,即使在没有源代码的情况下也能检查第三方组件的错误。
  BoundsChecker能检测的错误包括:
  (1)指针操作和内存、资源泄漏错误
  比如:内存泄露;资源泄漏;对指针的错误操作。
  (2)内存操作方面的错误
  比如:内存读、写溢出;使用为初始化的内存。
  (3)API函数使用错误
二、Valgrind 
    Valgrind是一款守GNU通用公共许可证条款的自由软件,主要用于内存调试、内存泄漏检测以及性能分析。Valgrind这个名字取自北欧神话中英灵殿的入口。最初作者是Julian Seward,他于2006年由于在开发Valgrind上的工作获得了第二届Google-O‘Reilly开源代码奖。
 目前的3.7.0版支持X86/Linux, AMD64/Linux, ARM/Linux, PPC32/Linux, PPC64/Linux, S390X/Linux, ARM/Android (2.3.x), X86/Darwin and AMD64/Darwin (Mac OS X 10.6 and 10.7)等操作系统。
    Valgrind工具包包含多个工具:
    1. Memcheck 工具主要检查下面的程序错误: 
          使用未初始化的内存 (Use of uninitialised memory) 
          使用已经释放了的内存 (Reading/writing memory after it has been free’d) 
          使用超过 malloc分配的内存空间(Reading/writing off the end of malloc’d blocks) 
          对堆栈的非法访问 (Reading/writing inappropriate areas on the stack) 
          申请的空间是否有释放 (Memory leaks – where pointers to malloc’d blocks are lost forever) 
          malloc/free/new/delete申请和释放内存的匹配(Mismatched use of malloc/new/new [] vs free/delete/delete []) 
          src和dst的重叠(Overlapping src and dst pointers in memcpy() and related functions) 
    2. Callgrind 
    Callgrind收集程序运行时的一些数据,函数调用关系等信息,还可以有选择地进行cache 模拟。在运行结束时,它会把分析数据写入一个文件。callgrind_annotate可以把这个文件的内容转化成可读的形式。 
    3. Cachegrind 
    它模拟 CPU中的一级缓存I1,D1和L2二级缓存,能够精确地指出程序中 cache的丢失和命中。如果需要,它还能够为我们提供cache丢失次数,内存引用次数,以及每行代码,每个函数,每个模块,整个程序产生的指令数。这对优化程序有很大的帮助。 
    4. Helgrind 
    它主要用来检查多线程程序中出现的竞争问题。Helgrind 寻找内存中被多个线程访问,而又没有一贯加锁的区域,这些区域往往是线程之间失去同步的地方,而且会导致难以发掘的错误。Helgrind实现了名为” Eraser” 的竞争检测算法,并做了进一步改进,减少了报告错误的次数。 
    5. Massif 
    堆栈分析器,它能测量程序在堆栈中使用了多少内存,告诉我们堆块,堆管理块和栈的大小。Massif能帮助我们减少内存的使用,在带有虚拟内存的现代系统中,它还能够加速我们程序的运行,减少程序停留在交换区中的几率。 
三、GFlags 和 PageHeap
     微软提供的一套工具,在此不过多解释了,收集几个文档位置,供参考。
    1. msdn GFlags工具相关主题 
    2. 如何在 Windows XP 和 Windows 2000 中使用 Pageheap.exe (微软帮助和支持文章编号:286470)
    3. 如何使用 PageHeap 实用程序来检测 Microsoft Visual c + + 项目中的内存错误 (微软帮助和支持文章编号:264471)
    4. CSDN rj20092010 文章:浅谈MFC内存泄露检测及内存越界访问保护机制 

相关推荐