我們前面寫了一篇關(guān)于利用malloc的鉤子回調(diào)定位程序內(nèi)存泄漏位置的文章。實際上glibc也利用了malloc這一機制,給我們提供了現(xiàn)成的內(nèi)存泄漏定位工具mtrace。 mtrace 用于開啟內(nèi)存使用記錄,muntrace用于取消內(nèi)存使用記錄。內(nèi)存使用情況會記錄到一個文件,文件名由環(huán)境變量:MALLOC_TRACE指定。
#include <mcheck.h>
mtrace xxx xxx.log 此處調(diào)用的mtrace是glibc提供的一個用于解析mtrace函數(shù)執(zhí)行結(jié)果的perl腳本,位于/usr/bin下面,你可以用vi打開。 實例如下:
運行結(jié)果: 這是編譯程序不加-g選項的情況,可以看到caller一列的信息為??:?。caller這一列表示未釋放的malloc位置的文件名和行號。 加了-g選項的結(jié)果: 原理很簡單,mtrace函數(shù)會注冊malloc和free的鉤子(見前面文章),在鉤子里打印信息到我們設(shè)置的文件。再利用mtrace腳本工具對統(tǒng)計信息進行解析,沒有成對出現(xiàn)的malloc/free即被認為是內(nèi)存泄漏,同時利用-g后a.out里的調(diào)試信息,輸出泄漏的所在文件名和行號。 |
|
來自: 西北望msm66g9f > 《編程》