说明
UMDH 的字面意思是The user-mode dump heap utility (用户模式转储堆实用程序)它是一款轻量级的内存泄露分析工具。
以前使用过umdh查询过vc上的内存泄漏,通过比较的方法,比较出一段时间之后,内存的增长情况。
但是c#可以使用这个工具吗?
我写了一个简单c#app,不要内容如下:
c#测试代码
public class MyThread
{
public void Thread1()
{
for (int i = 0; i < 100; i++)
{
Thread.Sleep(2000);
Int32[] xx = new Int32[i];
Console.WriteLine(xx.Length);
}
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello,this is my .Net program.");
MyThread mt = new MyThread();
Thread t1 = new Thread(new ThreadStart(mt.Thread1));
Thread t2 = new Thread(new ThreadStart(mt.Thread1));
t1.Start();
t2.Start();
}
}
分析步骤
然后使用
调用umdh -pn:aa.exe -f:dump1.txt 记录一个内存堆栈
过段时间后,调用umdh -pn:aa.exe -f:dump2.txt记录另一个
然后调用umdh dump1.txt dump2.txt -f:result.txt比较改变,内容如下:
可以看到和vc差别很多,不能定位到具体的哪一行,大致能能看出来,可能是出现新的内存申请(alloc)不能像vc一样直接可以定位到哪个函数,哪个api。
// Debug library initialized ...
DBGHELP: console_cs - private symbols & lines
F:\works\Works_Cs\winform\bin\Debug\console_cs.pdb
+ d68 ( 1f48 - 11e0) 7 allocs BackTrace1C347A0
+ 3 ( 7 - 4) BackTrace1C347A0 allocations
ntdll! ?? ::FNODOBFM::`string'+000153CB
mscoreei!calloc_impl+0000005D
mscoreei!calloc_crt+00000033
mscoreei!CRT_INIT+00000107
mscoreei!__DllMainCRTStartup+0000007A
mscoreei!OnShimDllMainCalled+00000056
MSCOREE!DllMain+00000064
MSCOREE!CRT_INIT+000001B8
ntdll!LdrpInitializeThread+0000017C
ntdll!LdrpInitialize+0000009F
ntdll!LdrInitializeThunk+0000000E
+ d68 ( 1f48 - 11e0) 7 allocs BackTrace1C34B60
+ 3 ( 7 - 4) BackTrace1C34B60 allocations
ntdll! ?? ::FNODOBFM::`string'+000153CB
MSVCR120_CLR0400!calloc_impl+0000005D
MSVCR120_CLR0400!calloc_crt+00000033
MSVCR120_CLR0400!__CRTDLL_INIT+00000124
ntdll!LdrpInitializeThread+0000017C
ntdll!LdrpInitialize+0000009F
ntdll!LdrInitializeThunk+0000000E
+ c30 ( 1c70 - 1040) 7 allocs BackTrace1C346E0
+ 3 ( 7 - 4) BackTrace1C346E0 allocations
ntdll! ?? ::FNODOBFM::`string'+000153CB
ntdll!RtlProcessFlsData+00000125
KERNELBASE!FlsSetValue+0000005D
MSCOREE!CRT_INIT+000000FE
MSCOREE!CRT_INIT+0000019F
ntdll!LdrpInitializeThread+0000017C
ntdll!LdrpInitialize+0000009F
ntdll!LdrInitializeThunk+0000000E
......
已经很久没有接触c#了,也许它已经有了很好的内存测试工具。如果是普通的客户端应用,它自身的内存回收机制会处理好这些的。
关于: