本文轉(zhuǎn)載自:騰訊WeTest專欄--《【騰訊內(nèi)部工具】內(nèi)存泄漏分析工具tMemoryMonitor》
【引言】
今天給大家介紹一款騰訊自主研發(fā)毕莱,榮獲2015年十佳組件第一名的“tMemoryMonitor”內(nèi)存泄漏分析工具。該騰訊內(nèi)部工具已經(jīng)在騰訊WeTest官網(wǎng)內(nèi)開放給用戶使用,助您在工作中掃除內(nèi)存泄露問題俺夕,讓工作精益求精生兆。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 工具使用入口
【工具簡介】
tMemoryMonitor簡稱TMM哆窿,是一款運(yùn)行時C/C++內(nèi)存泄漏檢測工具。TMM認(rèn)為在進(jìn)程退出時援奢,內(nèi)存中沒有被釋放且沒有指針指向的無主內(nèi)存塊即為內(nèi)存泄漏,并進(jìn)而引入垃圾回收機(jī)制忍捡,在進(jìn)程退出時檢測出堆內(nèi)存中所有沒有被引用的內(nèi)存單元集漾,因而內(nèi)存泄漏檢測準(zhǔn)確率為100%。TMM下載地址:http://wetest.qq.com/cloud/index.php/index/TMM
【開發(fā)目的】
防泄漏測試一直是編程測試中非常重要的一個模塊砸脊,盡管目前市面上已有一些Windows平臺下的內(nèi)存泄漏動態(tài)檢測工具帆竹,比如UMDH,VLD脓规,Purify栽连,BoundsCheck等,但其中Purify和BoundsCheck是昂貴的商用軟件侨舆,UMDH需要人工獲取內(nèi)存快照秒紧,操作門檻較高,VLD則需要修改源程序的代碼挨下,同時這幾款工具都存在誤報情況熔恢,因此準(zhǔn)確性不高。而我們的tMemMonitor就是一款針對Windows平臺專業(yè)臭笆、準(zhǔn)確叙淌、易用的內(nèi)存泄漏分析工具。
目前正使用TMM的騰訊團(tuán)隊
【算法原理】
Windows中有多種級別的內(nèi)存分配函數(shù)愁铺,其中鹰霍,最底層的是ntdll.dll提供的Rtl系列函數(shù),在這之上的有Windows?API提供的heap管理函數(shù)茵乱,再上層茂洒,C/C++庫提供了malloc/free函數(shù)和new/delete操作符,因此替換如此層級復(fù)雜的函數(shù)比較困難瓶竭,同時如果替換現(xiàn)有的堆分配函數(shù)督勺,則無法做到和原有函數(shù)的執(zhí)行效果完全一致,所以替換原生的堆分配函數(shù)對于Windows系統(tǒng)來說幾乎是不可行的斤贰,那么只能wrap(包裹)這些堆分配函數(shù)智哀。
Linux下的內(nèi)存檢測工具,比如Valgrind就采用了包裹堆分配函數(shù)的方法荧恍,但它包裹的方法是不透明的瓷叫,在調(diào)用棧中會多出額外一幀。TMM則采用全透明的包裹函數(shù),將掛鉤函數(shù)分為前后二部分(如圖1所示)赞辩。在函數(shù)調(diào)用前執(zhí)行
per-hook函數(shù)雌芽,在函數(shù)返回前調(diào)用執(zhí)行post-hook函數(shù)。有了前后掛鉤函數(shù)辨嗽,TMM就可以在堆分配/釋放函數(shù)執(zhí)行前獲得參數(shù)世落,并修改分配大小之類的參數(shù);在函數(shù)執(zhí)行后糟需,記錄分配的大小和地址屉佳、調(diào)用棧之類的信息。
【案例介紹】
下面我們通過測試市面上一款我們常用的音樂軟件洲押,來看看這款軟件能給我們帶來怎樣的收益武花。
在擁有Administrator權(quán)限的情況下啟動TMM,然后在列表區(qū)添加XX音樂這款軟件杈帐,就已經(jīng)成功在TMM中加載了這款程序体箕。
1.我們在XX音樂中隨意選擇一首歌進(jìn)行播放
2.播放結(jié)束后正常退出XX音樂,這時TMM就會彈出一個名為“data”文件夾挑童,里面包括著在播放音樂期間的數(shù)據(jù)泄漏詳情
3.點(diǎn)開文檔后就能詳細(xì)查看文件泄漏的具體報告
日志所在文件夾
報告內(nèi)容
泄露情況報告
【注意事項】
1.安裝TMM時累铅,用戶應(yīng)有Administrator權(quán)限,并且TMM不支持中文安裝途徑站叼。
2.使用TMM時需要修改注冊表娃兽,如遇安全軟件彈窗警告,可將TMM加入信任列表放心使用
3.被檢測程序不能是加殼版本尽楔,因為加殼程序的函數(shù)名和函數(shù)地址已經(jīng)混淆
4.被檢測程序需是release版本
5.如需在分析報告中顯示泄漏點(diǎn)詳細(xì)堆棧信息投储,請在被檢測程序同級目錄放置同版本的PDB文件,PDB解析時目錄不支持中文
6.使用TMM導(dǎo)致被測程序退出時變慢屬于正常情況阔馋,此時TMM正在統(tǒng)計內(nèi)存泄漏情況玛荞,請不要手動強(qiáng)制結(jié)束進(jìn)程。
【總結(jié)】
TMM適用于PC端所有C/C++程序的內(nèi)存泄漏分析垦缅。對于被測程序冲泥,不需要修改源代碼,運(yùn)行一次被測程序就能夠準(zhǔn)確定位泄漏的文件名和行號壁涎。TMM是一款專業(yè)、準(zhǔn)確志秃、易用的內(nèi)存泄漏檢測工具怔球,值得每個程序員擁有。