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

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

概述那么在Windows下有什么好的内存泄漏检测工具呢?微软提供Visual Studio开发工具本身没有什么太好的内存泄漏检测功能,我们可以使用第三方工具Visual Leak Detector(以下简称vld)。 vld工具是VC++环境下一款小巧易用、免费开源的内存泄漏检测工具,vld可以显示导致内存泄漏的完整内存分配调用堆栈。vld的检测报告能够对每个内存泄漏点提供完整的堆栈跟踪,并且包含其源 那么在windows有什么好的内存泄漏检测工具呢?微软提供VisualStudio开发工具本身没有什么太好的内存泄漏检测功能,我们可以使用第三方工具VisualLeakDetector(以下简称vld

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

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

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

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

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

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

#include "main.h"#include "AppDelegate.h"#include "cocos2d.h" #include <vld.h> USING_NS_CC; int APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR    lpCmdline,int       nCmdshow){    UNREFERENCED_ParaMETER(hPrevInstance);    UNREFERENCED_ParaMETER(lpCmdline);     // create the application instance    AppDelegate app;    return Application::getInstance()->run();}

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

bool HelloWorld::init(){if ( !Layer::init() ){return false;}    __String *s = new __String();     log("%s",s->getCString()); … … return true;}

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

VisualLeakDetectorVersion2.4RC2installed.

ReadyforGLSL

ReadyforOpenGL2.0

……

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

----------Block526166at0x0821FA80:84bytes----------

LeakHash:0x780B2033,Count:1,Total84bytes

CallStack(TID4660):

......

----------Block526214at0x08224378:8bytes----------

LeakHash:0xE1DC1852,Total8bytes

CallStack(TID4660):

......

Data:

636F636F733264206175746F72656C65cocos2d.autorele

61736520706F6F6C00CDCDCDCDCDCDcdase.pool........

VisualLeakDetectordetected33memoryleaks(2892bytes).

Largestnumberused:3204961bytes.

Totalallocations:69022415bytes.

VisualLeakDetectorisNowexiting.

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

----------Block1153at0x01533C70:48bytes----------

LeakHash:0x5545A5ED,Total48bytes

CallStack(TID2088):

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

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

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

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

d:\helloworld\classes\appdelegate.cpp(30):HelloWorld.exe!AppDelegate::applicationDIDFinishLaunching+0x5bytes

d:\helloworld\cocos2d\cocosd\platform\win32\ccapplication.cpp(74):HelloWorld.exe!cocos2d::Application::run+0xFbytes

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

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

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

0x7563850D(fileandlinenumbernotavailable):KERNEL32.DLL!BaseThreadInitThunk+0xEbytes

0x77B7BF39(fileandlinenumbernotavailable):ntdll.dll!RtlinitializeExceptionChain+0x85bytes

0x77B7BF0C(fileandlinenumbernotavailable):ntdll.dll!RtlinitializeExceptionChain+0x58bytes

Data:

1C340701010000002700000000000000.4......'.......

2C340701A077010300CDCDCDCDCDCDCD,4...w..........

CDCDCDCDCDCDCDCD000000000F000000................

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

定位内存泄漏点

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



更多内容请关注最新Cocos图书《Cocos2d-x实战 C++卷》 本书交流讨论网站: http://www.cocoagame.net
更多精彩视频课程请关注智捷课堂Cocos课程: http://v.51work6.com
欢迎加入Cocos2d-x技术讨论群:@H_855_419@257760386


《Cocos2d-x实战 C++卷》现已上线,各大商店均已开售:

京东:http://item.jd.com/11584534.html

亚马逊:http://www.amazon.cn/Cocos2d-x%E5%AE%9E%E6%88%98-C-%E5%8D%B7-%E5%85%B3%E4%B8%9C%E5%8D%87/dp/B00PTYWTLU

当当:http://product.dangdang.com/23606265.html

互动出版网:http://product.china-pub.com/3770734

《Cocos2d-x实战 C++卷》源码及样章下载地址:

源码下载地址:http://51work6.com/forum.php?mod=viewthread&tid=1155&extra=page%3D1

样章下载地址:http://51work6.com/forum.php?mod=viewthread&tid=1157&extra=page%3D1

欢迎关注智捷iOS课堂微信公共平台 总结

以上是内存溢出为你收集整理的Cocos开发中性能优化工具介绍之Visual Studio内存泄漏检测工具——Visual Leak Detector全部内容,希望文章能够帮你解决Cocos开发中性能优化工具介绍之Visual Studio内存泄漏检测工具——Visual Leak Detector所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1009637.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存