`
netcome
  • 浏览: 479530 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

UMDH在内存泄露分析中的应用

阅读更多

今天开会无聊,又想起了之前在软件测试过程中umdh的应用,于是想写个总结,由于忘记了一些细节,于是跑到微软的官方上找到了经典文章《Umdhtools.exe: How to use Umdh.exe to find memory leaks》,又读了一遍,非常经典,在搜索中恰好发现phiger在其csdn博客中已经写过了有关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环境变量里面。(我注:建议大家从微软官方网站上http://support.microsoft.com/kb/311503/下载符号文件,普通系统一般都数据不全,没有完成的符号表,在后面显示的内存调用栈中会出现大量读不懂的符号…
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选项,确认。(我接着注:通过界面设置gflags,偶没用过;在使用完umdh之后,要释放gflags对应用的控制,否则该应用会一直被注入监控hook代码,可能导致性能下降…)
转储以捕获
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 0×14 allocations (@ 0×00000428) by: BackTrace00053
ntdll!RtlDebugAllocateHeap+0×000000FD
ntdll!RtlAllocateHeapSlowly+0×0000005A
ntdll!RtlAllocateHeap+0×00000808
MyApp!_heap_alloc_base+0×00000069
MyApp!_heap_alloc_dbg+0×000001A2
MyApp!_nh_malloc_dbg+0×00000023
MyApp!_nh_malloc+0×00000016
MyApp!operator new+0×0000000E
MyApp!LeakyFunc+0×0000001E
MyApp!main+0×0000002C
MyApp!mainCRTStartup+0×000000FC
KERNEL32!BaseProcessStart+0×0000003D
上面就是分配那块内存的Stack trace信息,在这里我们看到实在MyApp!LeakyFunc函数里面有个new操作。以上信息说明,在两个日志时间间隔里面,MyApp!LeakyFunc分配了新的内存,但是还没有释放。

 

好了,感谢phiger的分享和我的注解,哈哈,不过有一点我深有体会,例子毕竟是例子,只是个入门,在我的实际内存调试过程中,从来没有上面如此简单明了的函数调用者,特别是在Java应用程通过JVM调用C、c++等原生代码,那分析起来可真是费劲,下次总结一下。

分享到:
评论

相关推荐

    umdh分析内存泄露的方法

    内存泄漏是计算机编程中一个严重的问题,特别是在长时间运行的服务或应用程序中。UMDH(User-Mode Dump Heap)是Windows操作系统提供的一种工具,用于分析进程的内存使用情况,从而帮助开发者定位潜在的内存泄漏问题...

    [微软工具] 基于WinDbg的内存泄漏分析 - 比较复杂情况下调试

    在IT行业中,内存泄漏是一个常见的问题,特别是在长时间运行的应用程序中。它会导致系统资源逐渐耗尽,最终影响程序性能甚至导致系统崩溃。本篇将详细探讨如何利用微软提供的工具,尤其是WinDbg,来分析和定位复杂的...

    【Windows】内存检测工具-UMDH

    UMDH在系统管理员和软件开发者中广泛应用,因为它能够提供详细的内存堆栈信息,这对于定位内存管理问题至关重要。 UMDH的工作原理是生成一个用户模式堆转储,这个转储包含了进程在特定时刻的内存快照。通过分析这个...

    EasyUMDH查找内存泄露

    标题中的“EasyUMDH查找内存泄露”指的是一个简化版的UMDH(User-Mode Dump Heap)工具,这个小工具主要用于帮助开发者检测和定位程序中的内存泄露问题。内存泄露是编程中常见的错误,当程序不再需要某块内存时,...

    umdh-gui:用于内存泄漏查找程序的GUI

    用户模式转储堆(UMDH)工具Umdh.exe分析了给定进程的Microsoft Windows堆内存分配。 特征: 快照创建 报告制作 报告检视 过滤以查看报告 排序以查看报告 摘要信息 不同的数据表示形式(过滤的纯文本,列表,通话...

    vld-10检查内存泄漏工具

    1. **自动检测**:VLD-10能够自动检测应用程序运行过程中的内存泄漏,无需修改代码。 2. **实时监控**:在程序运行时,VLD-10实时跟踪内存分配和释放,帮助开发者快速定位问题。 3. **详细报告**:当程序结束时,VLD...

    Advanced Windows Debugging 英文原版

    本章讲述了如何识别、分析和处理资源泄漏问题,包括句柄泄漏和内存泄漏。 第10章 同步 同步问题在多线程编程中非常关键,本章介绍了同步机制的基本知识和如何诊断同步问题。 第三部分 高级主题 第11章 编写定制的...

    Debugging_Tools_for_Windows.rar

    1. **内存分析**:Windbg可以通过UMDH(User-Mode Dump Heap)命令行工具,分析内存转储文件中的堆信息,帮助定位内存泄漏或异常分配的问题。 2. **调试引擎**:Windbg内置了强大的调试引擎,支持内核模式和用户...

    Windows调试工具入门-1(调试工具介绍)

    - **UMDH(User Mode Dump Heap)**:专门用于用户模式堆分析,可帮助识别内存泄漏等问题。 - **USBView**:新增的工具,用于查看系统中连接的USB设备信息,有助于USB相关驱动或应用的调试。 此外,虽然未直接包含...

    Drivertool.rar

    6. Memory诊断工具:如PoolMon或UMDH,用于检查内核内存池使用情况和检测内存泄漏。 这些工具的综合运用,可以帮助驱动开发者在设计、编码、测试和调试的每个阶段都能有效地进行工作,提高软件质量,降低出错的可能...

    fileoperating.rar_操作系统开发_Visual_C++_

    在"fileoperating.rar"文件中,可能包含了一系列的操作系统课程设计实验,比如创建简单的进程调度模拟器、内存分配器、文件管理系统或者简单的设备驱动程序。通过实际编写代码,学生可以更好地理解和掌握操作系统的...

Global site tag (gtag.js) - Google Analytics