`

内存泄露检测工具

阅读更多
转:http://hi.baidu.com/gamecrack/blog/item/3fb88c446c1a482bcefca35b.html

最近将一个指纹匹配算法按照AFIS系统的接口标准做成dll上服务器测试,结果在进行200万人指纹的大库比对时出错了,通过分析发现是dll中存在内存泄露导致系统资源耗尽。虽然一次只有那么200kByte,但乘上200万这个基数也是不小。于是找来了两个工具来检测代码中的内存泄露:VLD和LeakDiag。

1.Visual Leak Detector 1.0 (VLD)
这是一个小巧内存检测工具,是为Visual C++用户设计的。其特色为:
简单易用,只需要在需要进行内存泄漏检测的的主程序代码中加入#include "VLD.h“,并将编译好的Lib文件放入默认的库目录,然后在Visual C++用Debug模式编译运行程序,程序运行结束后便可在Visual C++的输出窗口看到内存泄露检测结果。
通过宏定义控制测试行为,如报告的详略等。
支持Windows X64。
检测报告很直观,甚至能显示泄漏内存的内容。
下面是一段用于演示VLD功能的代码:

TestVLD.cpp

#include "stdafx.h"  
#include "vld.h"  
#include "afx.h"  
#include "string.h"  

typedef void(*FARPROC2)(int, char*);  // 用于调用dll中函数的指针  

void leak5Bytes();  // 泄漏5个字节内容为"ABCDE"内存  
void leakInDll();   // 调用dll中会造成内存泄漏函数  

int _tmain(int argc, _TCHAR* argv[])  
{  
int * p = new int[10];   
for (int i=0; i<10; ++i) p[i]=i;  // 泄漏10个int的内存,内容分别为0到9  
leak5Bytes(); // 泄漏5个字节内存  
leakInDll();  // 调用dll中会造成内存泄泄漏的函数  
return 0;  
}  

void leak5Bytes()  
{  
char * p = new char[5];  
for (int i=0; i<5; ++i) p[i]='A'+i;  // 泄漏的5个字节内存为"ABCDE"  
}  

void leakInDll()  
{  
char *p = new char[16];  
strcpy(p, "dll leaking!");           // 调用dll函数,在dll中分配一个16字节的空间保存"dll leaking!",且不释放内存。  
HMODULE hMod = LoadLibrary(_T("Dll.dll"));  
if (hMod) {  
FARPROC2 hLeakInDll = (FARPROC2) GetProcAddress(hMod, "dllLeak");  
hLeakInDll(16, p);  
}  
}  


下面是Dll中被调用的函数代码
void dllLeak(int n, char * st)  
{  
char *p = new char[n];  
for (int i=0; i<n; ++i) p[i] = st[i];   
}  


运行完毕之后的输出为:

WARNING: Visual Leak Detector detected memory leaks! 
---------- Block 57 at 0x01C899D8: 16 bytes ---------- 
Call Stack: 
f:\rtm\vctools\crt_bld\self_x86\crt\src\new2.cpp (27): operator new[] 
f:\rtm\vctools\crt_bld\self_x86\crt\src\crt0.c (318): __tmainCRTStartup 
f:\rtm\vctools\crt_bld\self_x86\crt\src\crt0.c (187): wmainCRTStartup 
0x7D517D2A (File and line number not available): BaseProcessInitPostImport 
Data: 
64 6C 6C 20    6C 65 61 6B    69 6E 67 21    00 CD CD CD     dll.leak ing!.... 

---------- Block 56 at 0x01C89990: 5 bytes ---------- 
Call Stack: 
f:\rtm\vctools\crt_bld\self_x86\crt\src\new2.cpp (27): operator new[] 
f:\rtm\vctools\crt_bld\self_x86\crt\src\crt0.c (318): __tmainCRTStartup 
f:\rtm\vctools\crt_bld\self_x86\crt\src\crt0.c (187): wmainCRTStartup 
0x7D517D2A (File and line number not available): BaseProcessInitPostImport 
Data: 
41 42 43 44    45                                            ABCDE... ........ 

---------- Block 55 at 0x01C89928: 40 bytes ---------- 
Call Stack: 
f:\rtm\vctools\crt_bld\self_x86\crt\src\new2.cpp (27): operator new[] 
f:\rtm\vctools\crt_bld\self_x86\crt\src\crt0.c (318): __tmainCRTStartup 
f:\rtm\vctools\crt_bld\self_x86\crt\src\crt0.c (187): wmainCRTStartup 
0x7D517D2A (File and line number not available): BaseProcessInitPostImport 
Data: 
00 00 00 00    01 00 00 00    02 00 00 00    03 00 00 00     ........ ........ 
04 00 00 00    05 00 00 00    06 00 00 00    07 00 00 00     ........ ........ 
08 00 00 00    09 00 00 00                                   ........ ........ 

Visual Leak Detector detected 3 memory leaks. 
可以看到,VLD检测出了分别在主程序函数t_main、leak5Bytes以及Dll.dll中dllLeak的内存泄漏,并显示了泄漏内存的内容。

2. LeakDiag

之前的VLD必须和源代码一起编译,若是遇到主程序源码不方便重新编译的情况,则可以选择使用LeakDiag。LeakDiag是微软的一款内存泄漏检测工具,鉴于已经有大牛写了比较详尽的使用说明,我就不再赘述,直接引用大牛的博客地址:

http://www.cppblog.com/sandy/archive/2008/08/18/59260.html

LeakDiag下载地址:
ftp://ftp.microsoft.com/PSS/Tools/Developer%20Support%20Tools/LeakDiag/

工具:
1.    IBM   Rational   PurifyPlus是一套完整的运行时分析工具,旨在提高应用程序的可靠性和性能。PurifyPlus将内存错误和泄漏检测、应用程序性能描述、代码覆盖分析等功能组合在一个单一、完整的工具包中。   
网站: 
http://www-128.ibm.com/developerworks/rational/products/purifyplus 
从这里可以得到   IBM   Rational   的试用版(DVD), 
http://www-128.ibm.com/developerworks/cn/offers/sek/index.html 

2. BoundsChecker
BoundsChecker是一个C++运行时错误检测和调试工具。它通过在VisualStudio内自动化调试过程加速开发并且缩短上市的周期。BoundsChecker提供清楚,详细的程序错误分析,许多是对C++独有的并且在
static,stack和heap内存中检测和诊断错误,以及发现内存和资源的泄漏。
3. http://www.parasoft.com/
4. http://www.glowcode.com/





但是我在win7下安装LeakDiag 老是报 Error 1722, 很奇怪, 目前还没有解决。。。
Vld 不能显示调用堆栈内容,网上说程序路径不能有中文,但是我的路径都是英文的也,是不是我的vs2005是中文的,是不是这个原因呢。。。

引用
Visual Leak Detector Version 1.0 installed (single-threaded static).
WARNING: Visual Leak Detector detected memory leaks!
---------- Block 125 at 0x004579E0: 100 bytes ----------
  Call Stack:
    0x00190000 (File and line number not available): (Function name unavailable)
    0x00186000 (File and line number not available): (Function name unavailable)
  Data:
    CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........
    CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........
    CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........
    CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........
    CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........
    CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........
    CD CD CD CD                                                  ........ ........

---------- Block 124 at 0x004579A0: 1 bytes ----------
  Call Stack:
  Data:
    CD                                                           ........ ........
分享到:
评论

相关推荐

    windows下c++内存泄露检测工具使用方

    ### Windows 下 C++ 内存泄露检测工具使用详解 在 Windows 平台下进行 C++ 开发时,内存管理是一项非常重要的任务。由于 C++ 语言本身的特性,开发者需要手动管理内存分配与释放,这就很容易导致内存泄露的问题。...

    jni层内存泄漏检测工具

    JNI层内存泄漏检测工具是针对Android应用开发中的一个重要问题——JNI内存泄漏的解决方案。JNI,全称为Java Native Interface,允许Java代码与其他编程语言(如C++)交互,从而利用其性能优势。然而,由于Java和C/...

    Lua内存泄露检测工具LuaMonitor下载.rar

    本文将详细介绍Lua内存泄露检测工具LuaMonitor,以及如何利用它来提升项目性能。 LuaMonitor是一款专门针对Lua环境设计的内存泄露检测工具。它提供了一个直观的视图分析界面,帮助开发者了解程序在运行过程中内存的...

    vc++内存泄漏检测工具

    标题中提到的"vc++内存泄漏检测工具",通常指的是用于检测Visual C++编译的程序中内存泄漏的工具。这类工具可以帮助开发者定位和修复内存管理错误,确保程序的健壮性和稳定性。在C++环境中,内存泄漏检测通常通过...

    arm环境内存泄漏检测工具valgrind

    "arm环境内存泄漏检测工具valgrind"就是这样一个针对ARM平台的专业工具,它能帮助我们识别并解决内存泄漏问题。 Valgrind是一个开源的动态分析工具集,主要用于调试、性能评估和内存错误检测。在ARM环境下,...

    Windows内存泄漏排查工具

    为了解决这个问题,开发者通常会使用专门的内存泄漏检测工具。本文将详细介绍两个用于Windows平台的内存泄漏排查工具:LeakDiag和LDGrapher。 **LeakDiag** LeakDiag是由微软开发的一款轻量级内存泄漏检测工具,...

    JS内存泄漏检测工具

    JS内存泄漏检测工具:IEJSLeaksDetector

    内存泄露检测工具boundschecker11.rar

    BoundsChecker是一款由Compuware公司开发的著名内存泄露检测工具,专用于帮助程序员发现和修复这类问题。这款工具以其强大的功能和易用性在IT行业内得到了广泛的认可。 BoundsChecker 11版本可能是该工具的一个特定...

    两个超棒的内存泄露检测工具

    本文将详细介绍两款备受推崇的内存泄露检测工具,帮助开发者有效地找出并解决这类问题。 第一款工具是Valgrind。Valgrind是一款开源的动态分析工具,广泛用于内存泄漏检测、性能分析以及错误检测。它通过在运行时为...

    C++内存泄漏检测工具

    "Virtual Leak Detector"是一款针对C++的内存泄漏检测工具,它被设计用来帮助开发者定位并修复程序中的内存泄漏问题。这款工具通过对程序运行时的内存分配和释放进行跟踪,能够准确报告那些未被释放的内存块。通过...

    vs内存泄漏检测工具

    Visual Leak Detector(VLDB)是一款专为Visual Studio设计的第三方内存泄漏检测工具,它能帮助开发者在VS项目中定位和解决内存泄漏问题。 **1. 内存泄漏的理解** 内存泄漏是指程序在申请内存后,无法释放已申请的...

    内存泄露检测工具--VisualLeakDetector

    Visual Leak Detector(VLD)是一款专门为Microsoft Visual C++编译器设计的内存泄露检测工具。它可以在你的应用程序运行时自动检测内存泄露,并提供详细的报告,帮助开发者找出问题所在。VLD通过链接到你的可执行...

    Web 的内存泄漏检测工具

    内存泄漏 Web 的内存泄漏检测工具 更多信息请查看 www.iubang.com

    内存泄漏检测工具

    针对这个问题,专门的“内存泄漏检测工具”应运而生,如“js内存泄漏检测工具”和“IE Javascript leaks detector”。 1. **JavaScript内存管理** JavaScript的内存管理主要依赖于垃圾回收机制(Garbage ...

    内存泄露检测工具.net memory profile

    工具为评估试用版; 可以分析.net平台下编写的各类软件; 可以分析扩管类和非托管类代码;

    推荐4款linux下的c语言内存泄漏检测工具.zip

    推荐4款linux下的检测c语言编写的程序的内存泄漏工具 C语言和其他语言相比最大的特色就是能够操作内存 但是最常犯的错误也是内存泄漏(管杀不管埋) 所以我们需要用一些工具来帮助我们检测是否...奉上几款内存检测工具

    CheckMen 测试 Delphi内存泄漏工具

    CheckMen是一款专为Delphi开发者设计的内存泄漏检测工具,其核心组件是`CheckMem.pas`单元。这个工具的目的是帮助程序员在开发过程中找出可能导致内存泄漏的代码段,从而提高软件的稳定性和性能。 Delphi是一种基于...

Global site tag (gtag.js) - Google Analytics