文档章节

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

江河海流
 江河海流
发布于 2014/05/14 13:06
字数 1438
阅读 4444
收藏 2

一、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内存泄露检测及内存越界访问保护机制

© 著作权归作者所有

江河海流
粉丝 10
博文 44
码字总数 73431
作品 0
黄浦
私信 提问
在 Linux 平台中调试 C/C++ 内存泄漏方法

由于 C 和 C++ 程序中完全由程序员自主申请和释放内存,稍不注意,就会在系统中导入内存错误。同时,内存错误往往非常严重,一般会带来诸如系统崩溃,内存耗尽这样严重的 后果。从历史上看,...

Dicky
2011/09/25
0
0
浅谈MFC内存泄露检测及内存越界访问保护机制

本文所有代码均在VC2008下编译、调试。如果您使用的编译器不同,结果可能会有差别,但本文讲述的原理对于大部分编译器应该是相似的。对于本文的标题,实在不知道用什么表示更恰当,因为本文不...

songchang
2012/09/28
0
0
Linux下几款C++程序中的内存泄露检查工具

Linux下几款C++程序中的内存泄露检查工具 Linux下编写C或者C++程序,有很多工具,但是主要编译器仍然是gcc和g++。最近用到STL中的List编程,为了检测写的代码是否会发现内存泄漏,了解了一下...

优惠券发放
2018/08/25
0
0
C/C++内存问题检查利器—Purify

C/C++内存问题检查利器—Purify http://www.uml.org.cn/

江河海流
2014/05/14
0
0
c/c++服务器程序内存泄露问题分析及解决

由 www.169it.com 搜集整理 对于一个c/c++程序员来说,内存泄漏是一个常见的也是令人头疼的问题。已经有许多技术被研究出来以应对这个问题,比如 Smart Pointer,Garbage Collection等。Sma...

小星星程序员
2014/11/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Linux的基本命令

目录的操作命令(增删改查) 增: mkdir 目录名称; 查: ls 可以看到该目录下的所有的目录和文件 ls -a,可以看到该目录下的所有文件和目录,包括隐藏的 ls -l,可以看到该目录下的所有目录和...

凹凸凸
今天
2
0
在古老unix中增加新用户

Installing 4.3 BSD Quasijarus on SIMH 目标:要在4.3BSD中新增加用户dmr,指定目录/home/dmr,uid为10 gid=31(guest组,系统已建立) 4.3BSD还没有adduser或useradd 直接修改/etc/passwd...

wangxuwei
今天
2
0
Bootstrap(六)表单样式

基本样式 所有设置了 .form-control 类的 <input>、<textarea> 和 <select> 元素都将被默认设置宽度属性为 width: 100%;。 将 label 元素和前面提到的控件包裹在 .form-group 中可以获得最好...

ZeroBit
昨天
3
0
SSL 证书格式转换

SSL 证书格式转换 不同服务器情况下,需要不同的证书格式。 比如 pem 转 pfx。 pem在window 平台下可以导入,但是无法正常使用。 需要转换成pfx。 推荐在线转换工具,由中国数字证书网站提供...

DrChenXX
昨天
2
0
HAProxy

xx

Canaan_
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部