几个C++内存泄漏和越界检测工具简介-阿里云开发者社区

开发者社区> 一滴水珠> 正文

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

简介:
+关注继续查看
一、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内存泄露检测及内存越界访问保护机制 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
一个跨平台的 C++ 内存泄漏检测器
基本使用 对于下面这样的一个简单程序test.cpp: int main() { int* p1 = new int; char* p2 = new char[10]; return 0; } 我们的基本需求当然是对于该程序报告存在两处内存泄漏。
595 0
[C#]工具类—FTP上传下载
public class FtpHelper { /// /// ftp方式上传 /// public static int UploadFtp(string filePath, string filena...
628 0
Visual C++内存泄露检测工具(VLD)
简述 C/C++ 程序越复杂,内存的管理显得越重要,稍有不慎就会出现泄漏。如果内存泄漏不是很严重,在短时间内对程序不会有太大影响,这也使得内存泄漏问题有很强的隐蔽性,不易被发现。然而不管内存泄漏多么轻微,当程序长时间运行时,其破坏力是惊人的 - 从性能下降到内存耗尽,甚至会影响其他程序的正常运行。 简述 VLD 下载安装 使用 Visual Studio Qt
2156 0
symbian使用HookLogger检测内存泄漏
查找内存泄漏的代码 大部分的问题都是在一个函数内把参数alloc。而没有释放原来的内存。 一、 打开“开始”菜单中的“运行” 输入 : cmd //进入命令行模式 devices //这个命令可以查看我们的开发机器上安装了几个symbian SDK //S60_3rd_MR_2:com.
854 0
常用工具
好用的工具 XShell navicat PyCharm
1278 0
使用 Chrome 开发者工具分析内存问题
使用 Chrome 开发者工具分析内存问题
17 0
+关注
1
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载