2009年10月23日 星期五

Detect memory leak

WinDbg裡有個小tool - umdh - 可以幫忙檢查有沒有memory leak.
1. 先用gflags對你的軟體做設定,我們以記事本為例
gflags /i notepad.exe +ust

2. 把你的軟體跑起來,先對他做一個heap dump
umdh -pn:notepad.exe -f:first.txt

3. 讓你的程跑一段時間,再做第二個heap dump
umdh -pn:notepad.exe -f:second.txt

4. 接下來我們就可以看這兩個時間點中間有沒有memory leak
在下command之前,要先設定你的環境變數讓他能找到你的程式跟windows dll的symbol
set _NT_SYMBOL_PATH=C:\mysymbols;SRV*c:\symbols*http://msdl.microsoft.com/download/symbols

接下來就可以下command 去產生diff 檔
umdh first.txt second.txt -f:diff.txt

5. 最後就是從diff檔來檢查有沒有memory leak
檔案裡會有許多的區塊
+ 8c ( 8c - 0) 1 allocs BackTrace3202E24
+ 1 ( 1 - 0) BackTrace3202E24 allocations

ntdll!RtlReAllocateHeap+000001DE
vfbasics!AVrfpRtlReAllocateHeap+000001A0
COMCTL32!EditML_InsertchLine+00000061
COMCTL32!EditML_BuildchLines+00000435
COMCTL32!EditML_InsertText+0000017A
COMCTL32!EditML_Char+000001B5
COMCTL32!EditML_WndProc+0000045C
COMCTL32!Edit_WndProc+00000BDB
USER32!InternalCallWinProc+00000028
USER32!UserCallWinProcCheckWow+00000150
USER32!DispatchMessageWorker+00000306
USER32!DispatchMessageW+0000000F
notepad!WinMain+000000DC
notepad!WinMainCRTStartup+00000174
kernel32!BaseProcessStart+00000023


前面是memory增長的狀況,當量一直增加,就有可能是memory leak
增加/減少的Bytes量 (新Bytes - 舊Bytes)
增加/減少allocate的次數 (新次數 - 舊次數)

後面是memory被allocate時的call stack,如果猜測是memory leak
我們就可以查看這些function是不是忘記free某些resource所造成的

註:使用gflags後你的程式會跑的比平常慢,有些測試可能無法進行
測試完後記得把gflags關掉
gflags /i notepad.exe -ust

沒有留言:

張貼留言