二、正文
(一)WinDbg初始化
1.下载最新的Windbg,安装在被测机上。
2.打开Windbg,在File->Symbol File Path 窗口中输入
C:\WINDOWS\Symbols;d:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\symbols;.sympath SRV*d:\localsymbols*http://msdl.microsoft.com/download/symbols
否则可能会出现如下错误信息:
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\WINDOWS\system32\ntdll.dll
当然这时,输入 .load C:\WINDOWS\system32\ntdll.dll 命令也可解决。
3.运行需要调试的程序,在Windbg中File->Attach to Process中选择刚才运行的程序。如果是分析Dump文件则打开相应文件。
4.在出现的Command窗口中输入命令
.load C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\sos.dll
否则可能会出现如下错误信息:
No export dumpobj found
好,一切准备就绪,下面正式开始“抓鬼” 。
(二)用WinDbg hang模式,查找“内存溢出”的元凶
一般进行以下四个步骤:
1、!dumpheap –stat查看此进程所有对象的数量及所占内存大小;
2、试着筛选出某类比较多的对象,用!dumpheap -mt (地址)去找找几个对象的地址;
3、用!do (地址)命令查看对象的状态,属性的值等,看看能否发现一些端倪;
4、用!gcroot -nostacks (地址)查看对象的根正常不正常,如果有些对象的根不是自己预先设计的那样,很可能被自己没想到的对象强引用了,所以GC无法回收它,就泄漏了。
如果分析Dump文件,那之前Dump文件时用以下相似命令:
adplus.vbs -hang -p XXXX.exe-o d:"dump
下面预览一下运行这几个命令的结果,并作简要分析
0:007> !dumpheap -stat
此命令结果是按TotalSize(对象内存占用大小)排序的
total 11376 objects
Statistics:
MT Count TotalSize Class Name
7a79375c 1 12 System.Diagnostics.EventLogEntryType
7a78cd28 1 12 System.Net.Configuration.ProxyElement+AutoDetectValues
00db6aa0 1 12 Zte.EasyB.Common.KeyLockObj
00db5210 1 12 Zte.EasyB.Common.AlarmAgentConfigurationSectionHandler
00db50d8 1 12 Zte.EasyB.Common.NullAlarmAgent
……
7910234c 389 9336 System.Collections.ArrayList
790fd8b4 167 9352 System.Collections.Hashtable
79122610 170 29496 System.Collections.Hashtable+bucket[]
7912254c 851 54848 System.Object[]
00154c50 13 368000 Free
790f9244 6218 374644 System.String
Total 11376 objects