記憶體洩露分析demo
int _tmain(intargc, _TCHAR* argv[])
{
while(TRUE)
{
char *p = newchar[1024];
memset(p, 0, 1024);
Sleep(1000);
}
return 0;
}
r
Gflags标志設定好後,開啟cmd
鍵入要定位記憶體洩露的程式gflags.exe /I memroyleak.exe(程式名稱)+ust
如圖成功後,開啟memoryleak.exe程式
指令格式:umdh–pn:memoryleak.exe(程式名稱) –f:snap1.log(日志名稱)
程式運作一段時間後或者程式占用記憶體增加時,将memoryleak.exe退出。
然後再次建立heap快照,指令行無差别,snap1.log改為snap2.log或者其他。
設定好程式的符号路徑,如下圖
設定好後可以開始分析heap前後兩個快照的差異
分析差異指令:umdh –d snap1.log snap2.log –f:result.txt
分析完成後檢視結果result.txt
紅色為umdh定位出來的洩露點,我們在檢視源代碼
這樣我們就可以修改代碼中記憶體洩露的地方了。
開啟memoryleak.exe程式,windbg attach到該程序
指令:!heap –s檢視目前程序運作的所有堆的情況
然後F5讓程式運作一段時間或者記憶體有明顯的增加時再次通過!heap –s檢視目前堆的變化
如下圖
通過對比前後兩個堆的變化,發現0x012800000該位址的堆增加的很快而其他堆沒什麼變化
下面進一步定位
指令:!heap –stat –h 檢視對應對的狀态,發下該堆的記憶體基本被長度為0x424的塊占用,接下來我們在堆中搜尋該程序中哪些子產品占用0x424長度記憶體,如下圖
指令:!heap –flt s 424
通過搜尋程式記憶體中的堆發現長度為424的堆被大量的占用,進一步檢視時誰在使用這個位址
找到洩露點了,紅色部分的,如果程式對應的符号對應我們可以檢視記憶體洩露點在哪一行
記憶體洩露分析結束,如果你還有什麼好的方法可以共享
技術改變世界!
--狂詩絕劍