VisualStudio 怎么使用Visual Leak Detector

那么在Windows下有什么好的内存泄漏检测工具呢?微软提供Visual Studio开发工具本身没有什么太好的内存泄漏检测功能,我们可以使用第三方工具Visual Leak Detector(以下简称vld)。

vld工具是VC++环境下一款小巧易用、免费开源的内存泄漏检测工具,vld可以显示导致内存泄漏的完整内存分配调用堆栈。vld的检测报告能够对每个内存泄漏点提供完整的堆栈跟踪,并且包含其源文件及行号信息。

安装过程是,先在到地址http://vld.codeplex.com/下载vld安装文件,然后进行安装,安装过程中需要安装程序会配置环境变量。我们需要记住安装目录。

安装完成后打开要检测的Visual Studio工程,我们需要在工程中配置:vld头文件目录和vld库目录。

选中游戏工程,打开菜单“项目”→ “属性”弹出工程属性对话框,如图所示,选择“配置属性”→“VC++目录” →“常规”,在右边的“包含目录”中添加C:\Program Files (x86)\Visual Leak Detector\include,其中C:\Program Files (x86)\Visual Leak Detector是我的vld安装目录。“库目录”中添加C:\Program Files (x86)\Visual Leak Detector\lib\Win32,注意配置目之间需要用分号分隔开。

 

配置完成之后点击确定按钮关闭对话框,然后我们需要在程序代码中引入头文件#include <vld.h>,但是这个头文件在哪里引入比较好?如果是普通的一个VC++工程在哪里引入都无所谓,但是Cocos2d-x的工程就不同了,我们需要考虑跨平台,#include <vld.h>代码不宜添加到Classes目录下的h或cpp文件中,这个目录下的文件是要在其它平台编译运行的,而#include <vld.h>只是在Windrows平台才有效。我们可以在Win32目录(见图)下的main.cpp或main.h文件引入头文件。这些文件是与Win32平台有关的,不同平台移植的时候不需要。

 

如果在main.cpp中引入代码如下:

 

[html] view plaincopy

 

  1. #include "main.h"  
  2. #include "AppDelegate.h"  
  3. #include "cocos2d.h"  
  4.    
  5. #include <vld.h>  
  6.    
  7. USING_NS_CC;  
  8.    
  9. int APIENTRY _tWinMain(HINSTANCE hInstance,  
  10.                        HINSTANCE hPrevInstance,  
  11.                        LPTSTR    lpCmdLine,  
  12.                        int       nCmdShow)  
  13. {  
  14.     UNREFERENCED_PARAMETER(hPrevInstance);  
  15.     UNREFERENCED_PARAMETER(lpCmdLine);  
  16.    
  17.     // create the application instance  
  18.     AppDelegate app;  
  19.     return Application::getInstance()->run();  
  20. }  

 

 

引入之后,就测试一下了,我们来人为制造一个内存泄漏,与20.1.1一节一样在HelloWorldScene.cpp中修改代码:

 

[html] view plaincopy

 

  1. bool HelloWorld::init()  
  2. {  
  3. if ( !Layer::init() )  
  4. {  
  5. return false;  
  6. }  
  7.     __String *s = new __String();  
  8.    
  9.     log("%s",s->getCString());  
  10.    
  11. … …  
  12.    
  13. return true;  
  14. }  

 

 

运行工程,需要注意的是在程序运行过程中vld是没有堆栈输出的,但是日志会有输出vld的安装信息,日志信息如下:

Visual Leak Detector Version 2.4RC2 installed.

Ready for GLSL

Ready for OpenGL 2.0

… …

从日志中可以看到vld是否安装成功,以及安装的版本。要想看到vld检测报告需要退出程序后,才会在日志中输出信息。使用Cocos2d-x会输出很多日志信息,信息如下: 

---------- Block 526166 at 0x0821FA80: 84 bytes ----------

  Leak Hash: 0x780B2033, Count: 1, Total 84 bytes

  Call Stack (TID 4660):

... ...

 

---------- Block 526214 at 0x08224378: 8 bytes ----------

  Leak Hash: 0xE1DC1852, Count: 1, Total 8 bytes

  Call Stack (TID 4660):

... ...

  Data:

    63 6F 63 6F    73 32 64 20    61 75 74 6F    72 65 6C 65     cocos2d. autorele

    61 73 65 20    70 6F 6F 6C    00 CD CD CD    CD CD CD CD     ase.pool ........

 

Visual Leak Detector detected 33 memory leaks (2892 bytes).

Largest number used: 3204961 bytes.

Total allocations: 69022415 bytes.

Visual Leak Detector is now exiting.

 

其中一个Block表示一个内存泄漏点,在众多Block如果能够找到关于我们自己类的日志信息呢?我们可以查找关键字“helloworldscene.cpp”,这就可以定位到HelloWorld场景中的内存泄漏的Block了,我们找到如下日志信息:

---------- Block 1153 at 0x01533C70: 48 bytes ----------

  Leak Hash: 0x5545A5ED, Count: 1, Total 48 bytes

  Call Stack (TID 2088):

    f:\dd\vctools\crt_bld\self_x86\crt\src\new.cpp (57): MSVCR110D.dll!operator new

    d:\helloworld\classes\helloworldscene.cpp (33): HelloWorld.exe!HelloWorld::init + 0x7 bytes

    d:\helloworld\classes\helloworldscene.h (37): HelloWorld.exe!HelloWorld::create + 0xB1 bytes

    d:\helloworld\classes\helloworldscene.cpp (12): HelloWorld.exe!HelloWorld::createScene + 0x5 bytes

    d:\helloworld\classes\appdelegate.cpp (30): HelloWorld.exe!AppDelegate::applicationDidFinishLaunching + 0x5 bytes

    d:\helloworld\cocos2d\cocos\2d\platform\win32\ccapplication.cpp (74): HelloWorld.exe!cocos2d::Application::run + 0xF bytes

    d:\helloworld\proj.win32\main.cpp (19): HelloWorld.exe!wWinMain + 0xC bytes

    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (528): HelloWorld.exe!__tmainCRTStartup + 0x15 bytes

    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (377): HelloWorld.exe!wWinMainCRTStartup

    0x7563850D (File and line number not available): KERNEL32.DLL!BaseThreadInitThunk + 0xE bytes

    0x77B7BF39 (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0x85 bytes

    0x77B7BF0C (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0x58 bytes

  Data:

    1C 34 07 01    01 00 00 00    27 00 00 00    00 00 00 00     .4...... '.......

    2C 34 07 01    A0 77 01 03    00 CD CD CD    CD CD CD CD     ,4...w.. ........

    CD CD CD CD    CD CD CD CD    00 00 00 00    0F 00 00 00     ........ ........

 

从这个日志中能看到内存泄漏点,从日志的堆栈中找到我们自己编写的类,点击那一行打开代码窗口,定位内存泄漏点代码,如图所示。

 

定位内存泄漏点

 

找到哪一个有可能有内存泄漏,解决就不是问题了。

时间: 2024-09-25 04:54:25

VisualStudio 怎么使用Visual Leak Detector的相关文章

VisualStudio 使用Visual Leak Detector检查内存泄漏_C 语言

那么在Windows下有什么好的内存泄漏检测工具呢?微软提供Visual Studio开发工具本身没有什么太好的内存泄漏检测功能,我们可以使用第三方工具Visual Leak Detector(以下简称vld). vld工具是VC++环境下一款小巧易用.免费开源的内存泄漏检测工具,vld可以显示导致内存泄漏的完整内存分配调用堆栈.vld的检测报告能够对每个内存泄漏点提供完整的堆栈跟踪,并且包含其源文件及行号信息. 安装过程是,先在到地址http://vld.codeplex.com/下载vld安

Cocos开发中性能优化工具介绍之Visual Studio内存泄漏检测工具——Visual Leak Detector

那么在Windows下有什么好的内存泄漏检测工具呢微软提供Visual Studio开发工具本身没有什么太好的内存泄漏检测功能我们可以使用第三方工具Visual Leak Detector以下简称vld. vld工具是VC++环境下一款小巧易用.免费开源的内存泄漏检测工具vld可以显示导致内存泄漏的完整内存分配调用堆栈.vld的检测报告能够对每个内存泄漏点提供完整的堆栈跟踪并且包含其源文件及行号信息. 安装过程是先在到地址http://vld.codeplex.com/下载vld安装文件然后进行

Visual Leak Detector 2.2.3 Visual C++内存检测工具

  Visual Leak Detector是一款免费的.健全的.开源的Visual C++内存泄露检测系统.相比Visual C++自带的内存检测机制,Visual Leak Detector可以显示导致内存泄露的完整内存分配调用堆栈. 主页地址:http://vld.codeplex.com/ 旧版地址:http://www.codeproject.com/Articles/9815/Visual-Leak-Detector-Enhanced-Memory-Leak-Detectio    

boost filesystem memory leak!

问题描述 boost filesystem memory leak! int main(int argc, char* argv[]) { _CrtSetBreakAlloc(284); { boost::filesystem::path p(argv[0]); std::string b = p.extension().generic_string();; } _CrtDumpMemoryLeaks(); return 0; } 下面是output显示的内容, 分两部分, 一部分是用_CrtD

Visual C++内存泄露检测工具(VLD)

简述 C/C++ 程序越复杂,内存的管理显得越重要,稍有不慎就会出现泄漏.如果内存泄漏不是很严重,在短时间内对程序不会有太大影响,这也使得内存泄漏问题有很强的隐蔽性,不易被发现.然而不管内存泄漏多么轻微,当程序长时间运行时,其破坏力是惊人的 - 从性能下降到内存耗尽,甚至会影响其他程序的正常运行. 简述 VLD 下载安装 使用 Visual Studio Qt 更多参考 VLD VLD(Visual Leak Detector)是一款用于 Visual C++ 的免费内存泄露检测工具.相比较其它

.NET Visual Studio 代码性能分析工具_实用技巧

下面通过图文并茂的方式给大家介绍下,具体内容如下: 软件开发中的性能优化对程序员来说是一个非常重要的问题.一个小问题可能成为一个大的系统的瓶颈.但是对于程序员来说,通过自身去优化代码是十分困难的.幸运的是,有一些非常棒的工具可以帮助程序员进行代码分析和性能测试,从而大大简化程序员进行代码性能优化的过程.MSDN杂志2011年7月份曾发布主题为".NET代码分析工具和技术"的那一期,让广大程序员收获颇丰.四年过去之后,这些工具又进一步做出了很多改进,同时也出现了更多的选择.本文对当前主流

Visual C++内存泄露检测—VLD工具使用说明 .

Visual C++内存泄露检测-VLD工具使用说明 一.        VLD工具概述 Visual Leak Detector(VLD)是一款用于Visual C++的免费的内存泄露检测工具.他的特点有:可以得到内存泄漏点的调用堆栈,如果可以的话,还可以得到其所在文件及行号: 可以得到泄露内存的完整数据: 可以设置内存泄露报告的级别:并且是开源免费的.   二.        VLD下载 http://www.codeproject.com/tools/visualleakdetector.

C/C++的内存泄漏检测工具Valgrind memcheck的使用经历

Linux下的Valgrind真是利器啊(不知道Valgrind的请自觉查看参考文献(1)(2)),帮我找出了不少C++中的内存管理错误,前一阵子还在纠结为什么VS 2013下运行良好的程序到了Linux下用g++编译运行却崩溃了,给出一堆汇编代码也看不懂.久久不得解过后,想想肯定是内存方面的错误,VS在这方面一般都不检查的,就算你的程序千疮百孔,各种内存泄露.内存管理错误,只要不影响运行,没有读到不该读的东西VS就不会告诉你(应该是VS内部没实现这个内存检测功能),因此用VS写出的程序可能不是

Tomcat 8源码编译及导入Eclipse中研究

最近因为需求需要修改Tomcat中的某些功能,无奈只能研究那部分源码然后稍作修改. 目前Tomcat最新版是8.0,下载了源码包,编译并导入Eclipse中研究比较方便. 1. Tomcat8源码编译步骤1.1 先到Apache Tomcat 8.0官网下载最新版Source Code Distributions,解压到某个目录下,如D:\apache-tomcat-8.0.5-src 1.2 使用ant编译 (1)安装ant 如果机器上已经安装了ant可以省略这一步,否则去ant官网下载最新版