一對MS記憶體流失尋找工具(Leakdiag和LDGrapher)和STL類跨DLL調用引起記憶體流失

來源:互聯網
上載者:User

轉自:http://blog.csdn.net/zhangbinjn/archive/2009/08/13/4444641.aspx

 

今天寫點工作相關的,同時給大家介紹工具(Leakdiag和LDGrapher)。

這兩個星期可以說是覺都沒睡好,公司公測後啟動並執行遊戲,完成一個任務後記憶體飆到1G多,靠這遊戲還能怎麼玩,讓玩家怎麼玩啊,一個月幾十萬的儲值勢頭,怕沒兩個星期就會掉下去。這幾天一直和主程不停的尋找原因。

當然,這麼大的記憶體流失,最引起我們注意的當然就是圖形引擎這一塊了,只有地圖、光效和圖片資源才會佔用如此大的記憶體。但因為引擎代碼是另外項目組在維護,給我們的只是一些庫檔案,所以沒有辦法,我們只能對每一個通過底層介面頻繁的調用來測試底層的問題(只有拿出證據,你才有說話的權力)。但是,最後的結果讓我們失望,通過反覆的測試,排除底層的問題。

當然,進一步,我們又從調用特別繁瑣的尋路演算法進行排除,發現也不是其中的原因。真的是山窮水盡了,大家整的都很疲憊。記憶體還是飆,問題還是要解決。

可能大家看到標題,我寫了這麼多的費話可能,你會問題,你們早一點沒有想到找一個工具測一下啊。這個當然是首先想到的,不斷的去找的,不然要不會介紹今天的Leakdiag和LDGrapher,開始找了很多的工具去試去配,但是都沒有達到想要的結果。最後,微軟的Leakdiag和LDGrapher凳場了,也給我們帶來了光明。(得出一個結論:要用工具,要用好工具,要用對工具)。應該有很多人知道了其強大性,這裡再強調一個,我相信,中國的程式員應該學會一點,那就是好工具大家用,好資料大家看,好代碼大家學習的分享精神。

不說費話,網上有幾篇介紹Leakdiag和LDGrapher的文章,說的也算詳細:

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

還有幾點要強調:

1、log下來的並不是記憶體流失的,而是你運行開始,分配了還沒有釋放的;

2、log的堆棧可以設定為1-32,所以足夠你定位錯誤碼(Tools設定);

3、在你認為的關鍵點打幾個log,用LDGrapher線譜圖可以很明顯的看出記憶體配置的情況。

當然,最後寫一下出問題的原因,也是大多數有一定項目經驗的人都會遇到的STL類跨DLL調用的問題。這個問題的討論也很多,google一下你會有很大的收穫。

http://www.cppblog.com/fwxjj/archive/2009/06/16/87810.html

http://www.cppblog.com/xingmuxixi/archive/2009/05/18/83281.html

我們這次遇到的主要問題是在一個Dll中的介面中返回了一個std::vector的值對象,在.exe檔案中用了這介面,對返回的vector做了操作,也就是說,一個在Dll中建立的STL對象,在.exe中釋放的時候,會造成STL記憶體配置的異常,導致記憶體大量的泄漏。

好了,就寫這麼多了,問題解決了,可以回家睡個好覺了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.