天天看點

記憶體洩露分析.準備工具:windbg 2.準備環境:需要設定windbg符号路徑 3.利用工具umdh(user-mode dump heap)分析 4.Windbg手動分析記憶體洩露

記憶體洩露分析demo

記憶體洩露分析.準備工具:windbg 2.準備環境:需要設定windbg符号路徑 3.利用工具umdh(user-mode dump heap)分析 4.Windbg手動分析記憶體洩露

int _tmain(intargc, _TCHAR* argv[])  

{  

   while(TRUE)  

   {  

      char *p = newchar[1024];  

      memset(p, 0, 1024);  

      Sleep(1000);  

   }  

   return 0;  

}  

記憶體洩露分析.準備工具:windbg 2.準備環境:需要設定windbg符号路徑 3.利用工具umdh(user-mode dump heap)分析 4.Windbg手動分析記憶體洩露
記憶體洩露分析.準備工具:windbg 2.準備環境:需要設定windbg符号路徑 3.利用工具umdh(user-mode dump heap)分析 4.Windbg手動分析記憶體洩露
記憶體洩露分析.準備工具:windbg 2.準備環境:需要設定windbg符号路徑 3.利用工具umdh(user-mode dump heap)分析 4.Windbg手動分析記憶體洩露
記憶體洩露分析.準備工具:windbg 2.準備環境:需要設定windbg符号路徑 3.利用工具umdh(user-mode dump heap)分析 4.Windbg手動分析記憶體洩露

r

Gflags标志設定好後,開啟cmd

記憶體洩露分析.準備工具:windbg 2.準備環境:需要設定windbg符号路徑 3.利用工具umdh(user-mode dump heap)分析 4.Windbg手動分析記憶體洩露

鍵入要定位記憶體洩露的程式gflags.exe /I memroyleak.exe(程式名稱)+ust

如圖成功後,開啟memoryleak.exe程式

記憶體洩露分析.準備工具:windbg 2.準備環境:需要設定windbg符号路徑 3.利用工具umdh(user-mode dump heap)分析 4.Windbg手動分析記憶體洩露

指令格式:umdh–pn:memoryleak.exe(程式名稱) –f:snap1.log(日志名稱)

程式運作一段時間後或者程式占用記憶體增加時,将memoryleak.exe退出。

然後再次建立heap快照,指令行無差别,snap1.log改為snap2.log或者其他。

設定好程式的符号路徑,如下圖

記憶體洩露分析.準備工具:windbg 2.準備環境:需要設定windbg符号路徑 3.利用工具umdh(user-mode dump heap)分析 4.Windbg手動分析記憶體洩露

設定好後可以開始分析heap前後兩個快照的差異

記憶體洩露分析.準備工具:windbg 2.準備環境:需要設定windbg符号路徑 3.利用工具umdh(user-mode dump heap)分析 4.Windbg手動分析記憶體洩露

分析差異指令:umdh –d snap1.log snap2.log –f:result.txt

記憶體洩露分析.準備工具:windbg 2.準備環境:需要設定windbg符号路徑 3.利用工具umdh(user-mode dump heap)分析 4.Windbg手動分析記憶體洩露

分析完成後檢視結果result.txt

紅色為umdh定位出來的洩露點,我們在檢視源代碼

記憶體洩露分析.準備工具:windbg 2.準備環境:需要設定windbg符号路徑 3.利用工具umdh(user-mode dump heap)分析 4.Windbg手動分析記憶體洩露

這樣我們就可以修改代碼中記憶體洩露的地方了。

開啟memoryleak.exe程式,windbg attach到該程序

記憶體洩露分析.準備工具:windbg 2.準備環境:需要設定windbg符号路徑 3.利用工具umdh(user-mode dump heap)分析 4.Windbg手動分析記憶體洩露

指令:!heap –s檢視目前程序運作的所有堆的情況

然後F5讓程式運作一段時間或者記憶體有明顯的增加時再次通過!heap –s檢視目前堆的變化

如下圖

記憶體洩露分析.準備工具:windbg 2.準備環境:需要設定windbg符号路徑 3.利用工具umdh(user-mode dump heap)分析 4.Windbg手動分析記憶體洩露

通過對比前後兩個堆的變化,發現0x012800000該位址的堆增加的很快而其他堆沒什麼變化

下面進一步定位

記憶體洩露分析.準備工具:windbg 2.準備環境:需要設定windbg符号路徑 3.利用工具umdh(user-mode dump heap)分析 4.Windbg手動分析記憶體洩露

指令:!heap –stat –h 檢視對應對的狀态,發下該堆的記憶體基本被長度為0x424的塊占用,接下來我們在堆中搜尋該程序中哪些子產品占用0x424長度記憶體,如下圖

記憶體洩露分析.準備工具:windbg 2.準備環境:需要設定windbg符号路徑 3.利用工具umdh(user-mode dump heap)分析 4.Windbg手動分析記憶體洩露

指令:!heap –flt s 424

通過搜尋程式記憶體中的堆發現長度為424的堆被大量的占用,進一步檢視時誰在使用這個位址

記憶體洩露分析.準備工具:windbg 2.準備環境:需要設定windbg符号路徑 3.利用工具umdh(user-mode dump heap)分析 4.Windbg手動分析記憶體洩露

找到洩露點了,紅色部分的,如果程式對應的符号對應我們可以檢視記憶體洩露點在哪一行

記憶體洩露分析.準備工具:windbg 2.準備環境:需要設定windbg符号路徑 3.利用工具umdh(user-mode dump heap)分析 4.Windbg手動分析記憶體洩露

記憶體洩露分析結束,如果你還有什麼好的方法可以共享

技術改變世界!

--狂詩絕劍

繼續閱讀