Cocos開發中性能優化工具介紹之Visual Studio內存泄漏檢測工具——Visual Lea

那麼在Windows有什麼好的內存泄漏檢測工具呢?微軟提供Visual Studio開發工具自己沒有什麼太好的內存泄漏檢測功能,咱們可使用第三方工具Visual Leak Detector(如下簡稱vld

vld工具是VC++環境下一款小巧易用、免費開源的內存泄漏檢測工具,vld能夠顯示致使內存泄漏的完整內存分配調用堆棧。vld的檢測報告可以對每一個內存泄漏點提供完整的堆棧跟蹤,而且包含其源文件及行號信息。html

安裝過程是,先在到地址http://vld.codeplex.com/下載vld安裝文件,而後進行安裝,安裝過程當中須要安裝程序會配置環境變量。咱們須要記住安裝目錄。微信

安裝完成後打開要檢測的Visual Studio工程,咱們須要在工程中配置:vld頭文件目錄和vld目錄。app

選中游戲工程,打開菜單「項目」→ 「屬性彈出工程屬性對話框,如圖所示,選擇配置屬性」→「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目錄下的hcpp文件中,這個目錄下的文件是要在其它平臺編譯運行的,而#include <vld.h>只是在Windrows平臺纔有效。咱們能夠在Win32目錄(見圖)下的main.cppmain.h文件引入頭文件。這些文件是與Win32平臺有關的,不一樣平臺移植的時候不須要。開發工具

 

若是在main.cpp中引入代碼以下:測試

[html] view plaincopy在CODE上查看代碼片派生到個人代碼片網站

  1. #include "main.h"  spa

  2. #include "AppDelegate.h"  .net

  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在CODE上查看代碼片派生到個人代碼片

  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     ........ ........

 

從這個日誌中能看到內存泄漏點,從日誌的堆棧中找到咱們本身編寫的類,點擊那一行打開代碼窗口,定位內存泄漏點代碼,如圖所示

 

定位內存泄漏點

 

找到哪個有可能有內存泄漏,解決就不是問題了。



更多內容請關注國內第一本Cocos2d-x 3.2版本圖書《Cocos2d-x實戰:C++卷》

本書交流討論網站:http://www.cocoagame.net
更多精彩視頻課程請關注智捷課堂Cocos課程:http://v.51work6.com

歡迎加入Cocos2d-x技術討論羣:257760386

歡迎關注智捷iOS課堂微信公共平臺

相關文章
相關標籤/搜索