轉自: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記憶體配置的異常,導致記憶體大量的泄漏。
好了,就寫這麼多了,問題解決了,可以回家睡個好覺了。