UMDH查内存泄漏

1. 下载Debug Tools for Windows:http://www.microsoft.com/whdc/devtools/debugging/default.mspx (里边的UMDH就是用来查内存泄漏的),安装,并设置安装路径为环境变量(便于命令行启动)
2. 写测试程序test.exe,比如搞个线程不断的分配内存,不要太猛太暴力,把你机器搞的冒烟了,妈妈会骂的~
3. 设置符号集(Symbols file, 即.pdb文件)路径为_NT_SYMBOL_PATH环境变量,可以直接指定测试程序的生成目录(vc生成的pdb文件与可执行文件是放一块的)
4. 启动测试程序的堆跟踪:gflag -i test.exe +ust,   gflag也是Debug Tools for Windows里边的一个工具,用以启动或关闭对一个进程的高级调试和跟踪,会记在注册表里的
5. 启动测试程序test.exe, 记录其进程pid编号,可以用任务管理器看,也可以执行命令:tlist | findstr test.exe,比如:1884
6. 开始记录初始log, 执行命令: umdh -p:1884 -f:1884old.log,   这样就把泄漏操作之前的堆状态记录下来;
7. 继续执行测试程序,让他产生泄漏
8. 开始记录结束log,执行命令: umdh -p:1884 -f:1884new.log,   这样就把泄漏操作之后的堆状态记录下来;
9. 执行比较命令:umdh -d 1884old.log 1884new.log > cmp1884.txt,  将输出结果写到cmp1884.txt文件中。

如果pdb文件路径配置正确,cmp1884.txt中会记录类似如下的信息:

===================================================================
+   10600 (  10600 -      0)     10 allocs    BackTrace4A
+      10 (     10 -      0)    BackTrace4A    allocations

    ntdll!RtlpNtMakeTemporaryKey+000074CE
    ntdll!LdrAlternateResourcesEnabled+00002AFD
    ntdll!RtlDosSearchPath_Ustr+00000310
    MSVCR90D!malloc_base+000000FE
    MSVCR90D!malloc_dbg+00000306
    MSVCR90D!malloc_dbg+000000BF
    MSVCR90D!malloc_dbg+0000006C
    MSVCR90D!malloc+0000001B
    MSVCR90D!operator new+00000011
    TestUMDH!ReceivingThrd+00000040 (e:\code\testumdh\test.cpp, 27)
    MSVCR90D!beginthreadex+00000243
    MSVCR90D!beginthreadex+000001D9
    kernel32!GetModuleFileNameA+000001BA
====================================================================

这个就是分配内存时候的调用栈了,同时也指出了内存分配具体的函数名和代码行,剩下的就是体力活了

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值