項目接近尾聲了,可是在運行時會有memory leak(記憶體泄露) bug.產品在運行一天后,記憶體增長致1.4G,而我們產品的初始記憶體才有70M,問題很嚴重,決定採用WinDbg工具來分析代碼問題有原因到底在哪裡.
WinDbg是微軟發布的一款相當優秀的源碼級(source-level)調試工具,可以用於Kernel模式調試和使用者模式調試,還可以調試Dump檔案。
WinDbg下載:
Install Debugging Tools for Windows 32-bit Version
http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx
Install Debugging Tools for Windows 64-bit Versions
http://www.microsoft.com/whdc/devtools/debugging/install64bit.mspx
配置
在安裝完WinDbg後,需要在我們開發電腦上配置兩個環境變數值,_NT_ALT_SYMBOL_PATH(調試的bin目錄) 和_NT_SYMBOL_PATH(symcache目錄),如
_NT_ALT_SYMBOL_PATH(調試的bin目錄):
_NT_SYMBOL_PATH(symcache目錄)
還要再配置下這個:
接下來運行WinDbg
把要調試的進程載入進去
這時最好在記憶體溢出很明顯的時候載入較好,等下調試時較明顯.
以下適合調試C++代碼(產品有用到C++庫,是C++和C#一起寫的代碼,C#調用C++庫)
運行命令
!heap -s
結果如下:
0:035> !heap -s
Heap Flags Reserv Commit Virt Free List UCR Virt Lock Fast
(k) (k) (k) (k) length blocks cont. heap
-----------------------------------------------------------------------------
00250000 00000002 4096 3644 3672 1155 232 5 0 3 L
External fragmentation 31 % (232 free blocks)
00360000 00001002 1088 72 72 1 0 1 0 0 L
00370000 00008000 64 12 12 10 1 1 0 0
016b0000 00001002 64 44 44 5 1 1 0 0 L
017d0000 00041002 256 12 12 4 1 1 0 0 L
01920000 00001002 64 44 44 5 1 1 0 0 L
01a30000 00041002 256 40 40 12 3 1 0 0 L
01c50000 00001002 64 32 32 24 1 1 0 0 L
01f00000 00001002 1088 452 456 93 22 2 0 0 L
02030000 00001002 7232 4828 5012 459 106 24 0 0 L
021c0000 00001002 64 20 20 5 2 1 0 0 L
04bb0000 00041002 1280 308 308 5 1 1 0 0 L
05360000 00001002 256 16 16 3 1 1 0 0 L
054a0000 00001002 256 12 12 4 1 1 0 0 L
055e0000 00001002 256 12 12 4 1 1 0 0 L
05720000 00001002 256 12 12 4 1 1 0 0 L
05860000 00001002 256 12 12 4 1 1 0 0 L
059c0000 00001002 3136 1772 1772 566 37 1 0 0
External fragmentation 31 % (37 free blocks)
05ad0000 00001002 256 44 44 7 2 1 0 0 L
05c10000 00001002 256 36 36 16 4 1 0 0 L
080d0000 00001002 1088 56 84 47 4 3 0 0 L
08740000 00001002 1024 524 628 480 14 7 0 0 L
088b0000 00001002 256 160 200 25 5 2 0 0 L
08dc0000 00001002 64 12 12 4 1 1 0 0 L
09590000 00001002 1088 168 168 2 1 2 0 0 L
0ce90000 00001002 1088 84 84 61 3 1 0 0 L
-----------------------------------------------------------------------------
再運行命令 !heap –stat -h 059c0000 因發現這個堆裡有較大的記憶體佔有量
結果如:
再運行 !heap -flt s 64 631 來查看堆裡的記憶體配置
結果如
找堆裡相似性高有地址,如,我的相似性非常高.
再運行!heap -p -a 0c903fe0
結果如
就會把調用到DLL的方法顯示出來,就是記憶體泄露的地方,由於出於項目的保密原因,涉及項目中的代碼中的資訊我去掉了.
這隻是WinDbg眾多功能中的一種,我把它記錄下來,因為這把我們項目的記憶體從1.4G降到了109M.功勞很大.
作者:spring yang
出處:http://www.cnblogs.com/springyangwc/
本文著作權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文串連,否則保留追究法律責任的權利。