字號: 小 中 大 |
推薦給好友
上一篇 |
下一篇
內存泄漏的檢測、定位和解決經驗總結
發布: 2008-2-13 10:19 |
作者: 溫輝敏 |
來源:
網絡轉載 |
查看: 825次 | 進入軟件測試論壇討論
2.3.3.2MILY: 宋體">程序運行時內存泄漏檢測和修正方法
第二次內存泄漏檢測運行CSS測試程序得到的檢測報告發現的內存泄露全部集中在ACE/TAO(ACE的CORBA庫)提供的dll上,原因可能有如下兩種:
1) 程序中使用ACE和TAO的函數不當沒有正確釋放內存。
2) ACE和TAO庫確實是存在內存泄露問題。
由于此時顯示內存泄漏都是在TAO的函數中發生的,一下子沒了思路不知道怎么查了,只好一步一步的去查程序代碼了。
一開始測試程序只是將所有測試用例執行一遍然后就退出,為了測試是否會有運行時內存泄漏,讓測試程序將所有測試用例運行多遍才退出,理論上若有運行時內存泄漏的話,運行n遍測試用例產生的內存泄漏應該是運行一遍產生的內存泄漏的n倍。照著這個思路往下走,發現實際上并不是這么回事,基本上內存泄漏的字節數不變,由此可見測試用例沒有覆蓋到真正產生運行時內存泄漏的代碼,目前報告中發現的內存泄漏都只是程序關閉時產生的內存泄漏。
怎樣定位哪段代碼會產生運行時內存泄漏呢?程序運行時內存泄漏問題比較難定位,特別是程序有多個線程時,CSS內存泄漏檢測首先采用的方法為進行線程隔離。
1) 線程隔離法
將程序中主要的可能產生內存泄漏的線程一個個進行隔離,每次只運行其中的一個或關閉其中的一個,然后看BoundsChekcer產生的內存泄漏字節數是否有變化,以此來判斷該線程是否會產生內存泄漏。若該線程會產生內存泄漏則對該線程的代碼進行仔細分析以找出原因。
但CSS程序進行線程隔離后也發現這些線程都不產生內存泄漏。
2) 功能檢查法
此時只好從CSS的功能上來定位了,CSS主要是和Web進行交互,接受Web發過來的指令然后進行開關會等操作。分析由于測試程序只是測試CSS的內部流程,而沒有涉及到Web和CSS的接口那塊,而Web和CSS之間是使用CORBA機制通訊的,恰好內存泄漏報告也顯示內存泄漏基本集中在TAO(CORBA開發庫)那部分。
于是選擇一個Web頁面(獲取mcu列表),不斷的刷新該頁面,發現此時CSS使用內存果然在不斷上漲。也就是所獲取mcu列表這個功能對應的代碼會產生內存泄漏。
由于這個小功能對應的代碼是有限的就幾十行,仔細的檢查也沒發現什么問題,此時想到測試部認為NMS模塊沒有內存泄漏,只要對比NMS模塊的類似功能的代碼就能知道內存泄漏的原因了。但檢查發現兩邊代碼是一樣的,然后去測NMS的相關頁面發現NMS也有內存泄漏,只是因為NMS業務量比較小不太容易暴露該問題而已。
此時更相信可能是TAO開發庫自己產生的內存泄漏了,正要放棄之際,慕然出現了轉機,我們科室的李喜欣也使用了TAO庫,此時彭峰和他也參與進內存泄漏的攻關,經檢測發現喜欣的程序沒有內存泄漏。
一開始認為是使用的TAO庫的版本不一樣,于是就將我們的代碼放入李喜欣TAO庫所在環境中測試,發現在他哪里還是也有內存泄漏,也就是所和TAO庫的版本沒有關系?赡艽_實是代碼中函數使用方法有誤。
于是針對那部分功能代碼開始一條條語句屏蔽以期找出產生內存泄漏的語句,功夫不負有心人當我們將一條memset()語句屏蔽掉后終于沒有內存泄漏了。
分析原因是由于memset將一個CORBA對象所占內存清零了,雖然IDL中定義的為一個結構,但經過IDL文件的編譯,實際上在CORBA已將IDL中的結構轉換為相應的CORBA對象了,該對象中含有智能指針,這些指針在對象創建時都已經指向了一些動態分配的空間,由于memset操作,導致這些指針全部清零,于是那些指針原來指向動態分配的空間就永遠都得不到釋放進而產生了內存泄漏。
修正memset問題后就徹底的解決了內存泄漏問題。
三、推廣建議
本文簡要介紹了進行內存泄漏檢測的一些工具,并提出了一些進行內存泄漏檢測的有效方法和經驗,對于要進行內存泄漏檢測的項目具有一定的借鑒意義。
若需要文中提到的一些內存檢測工具可以聯系作者。
四、后記
經過漫長的內存泄漏檢測終于將內存泄漏問題解決了,修正CSS和NMS的內存一直都穩定在13M左右,在查找內存泄漏的問題中有以下幾點體會:
1. 不要隨便懷疑別人首先要懷疑自己,第一次內存泄漏檢測沒有徹底找出原因就是因為認為是開發庫自己的內存泄漏,第二次也差點就打算收工了。最后發現還是自己使用不當導致的。
2. 要有耐心,不能煩躁,當一個問題你找不到一絲絲線索時多和別人交流是很有幫助的,這次能徹底解決內存泄漏就是由于彭峰和李喜欣的加入,三個丑皮匠頂個諸葛亮真是至理名言。
3. 工具很重要,使用好的工具能事半功倍。
附錄1.監視程序內存使用的工具: MemSample
附錄2:BoundsChecker內存泄漏數據截圖
附錄3:BoundsChecker資源泄漏數據截圖

文章來源于領測軟件測試網 http://www.kjueaiud.com/