使用Umdh對付內存泄漏

 Umdh 是 Debugging Tools for Windows 裏面的一個工具, 可以從下面鏈接下載http://www.microsoft.com/whdc/devtools/debugging/default.mspx. UMDH主要通過分析比較進程的Heap Stack trace信息來發現內存泄露的。
使用 UMDH 之前
1.設置_NT_SYMBOL_PATH環境變量,例如用命令行:set _NT_SYMBOL_PATH=C:/WINDOWS/Symbols。把你自己程序的Symbol files (.pdb) 文件放在跟你執行文件同一目錄,或者加到_NT_SYMBOL_PATH環境變量裏面。
2.設置gflags,通過命令gflags -i notepad.exe +ust, gflags也是Debugging Tools for Windows裏面一個工具程序。也可以敲入Gflags命令,然後通過界面配置,進入界面後選擇Image File, 在Image欄寫入執行文件的名字,不需要全路徑,例如只要輸入notepad.exe, 然後按 TAB鍵,選中Create user mode stack trace database選項,確認。
轉儲以捕獲堆
1.獲得要分析的程序的進程號,比如你的進程號是1234,在命令行輸入umdh -p:1234 -f: 1234old.log,得到1234old.log文件。
2.繼續運行你的程序,或者說進行你懷疑會有內存泄漏的操作。
3.間隔一段時間後,輸入命令umdh -p:1234 -f: 1234new.log。
4.然後運行Umdh -d 1234old.log 1234new.log > cmp1234.txt。
分析比較結果
1.cmp1234.txt就是兩個時刻的Heap Stack Trace的差別,它類似於以下信息:
+ 5320 ( f110 - 9df0) 3a allocs BackTrace00053
Total increase == 5320

2.接下來就是查找對應的BackTrace,例如上面的意思是說在BackTrace00053處內存增加了5320個字節,在BackTrace00053你將能找到內存泄露處對應的CallStack。

3.接下來看一下BackTrace00053究竟有什麼東西,找到第二個日誌文件,在這裏就是1234new.log,搜索BackTrace00053, 如果你的Symbol File Path配置正確的話,在BackTrace00053你會發現有類似如下信息:
00005320 bytes in 0x14 allocations (@ 0x00000428) by: BackTrace00053
ntdll!RtlDebugAllocateHeap+0x000000FD
ntdll!RtlAllocateHeapSlowly+0x0000005A
ntdll!RtlAllocateHeap+0x00000808
MyApp!_heap_alloc_base+0x00000069
MyApp!_heap_alloc_dbg+0x000001A2
MyApp!_nh_malloc_dbg+0x00000023
MyApp!_nh_malloc+0x00000016
MyApp!operator new+0x0000000E
MyApp!LeakyFunc+0x0000001E
MyApp!main+0x0000002C
MyApp!mainCRTStartup+0x000000FC
KERNEL32!BaseProcessStart+0x0000003D
      上面就是分配那塊內存的Stack trace信息,在這裏我們看到實在MyApp!LeakyFunc函數裏面有個new操作。以上信息說明,在兩個日誌時間間隔裏面,MyApp!LeakyFunc分配了新的內存,但是還沒有釋放。
     下面鏈接是有關UMDH的視頻:http://wm.microsoft.com/ms/mcsp/servicedesk/080702.wmv.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章