Umdh进行内存泄露分析软件的下载、安装与使用

1 下载与安装

1.1 软件介绍

Umdh一款轻量级的内存泄露分析工具UMDH(User-Mode Dump Heap),是 Debugging Tools for Windows 里面的一个工具,主要通过分析比较进程的Heap Stack trace信息来发现内存泄露。

Umdh内存泄露分析适用范围:

  • dll内存泄露
  • 长时间才出现的
  • 不易分析的内存泄露问题

1.2 软件下载

安装网址:【下载Windows驱动程序工具包...

进入页面,如图所示:

选择“步骤2”下载SDK,操作步骤如图所示:

下载完成后,软件名称为:winsdksetup.exe,如图所示:

1.3 软件安装

选择并双击下载好的exe,弹出安装界面。选择第二个选项方便一会儿找到windbg的安装程序,点击next进入到下一步,如图所示:

这个页面不用管,直接点击next。

在这个页面选择需要用到的软件,umdh是对应的“Debugging Tools for Windows”,只勾选这个,点击next下载。

下载完成后可以看到对应目录下生成了一个文件夹“Windows Kits“,如图所示:

进入文件夹找到”Debuggers And Tools”安装程序,选择需要的版本进行安装。

安装完成后不会默认添加到桌面,可以搜索,找到exe位置添加快捷方式即可,如图所示:

Umdh wingbd 分析内存泄露

1.4 配置环境变量

变量名:_NT_SYMBOL_PATH

固定变量值:SRV*C:\Windows\symbols*http://msdl.microsoft.com/download/symbols

Umdh分析内存泄露需要启动进程,并找到对应进程.exe的pdb路径进行检测。如:abc.exe的pdb所在路径为“E:\work\abc\bin\Debug“,则配置应该为下图所示:

保存后便配置完成了。

2 使用umdh自动分析

自动分析需要使用cmd命令行来实现。

使用管理员权限启动cmd,输入以下命令进入到windbg.exe的目录中,如图所示:

cd C:\Program Files (x86)\Windows Kits\10\Debuggers\x64          // windbg 安装路径

输入要定位内存泄露的程序gflags.exe /i abc.exe +ust,如图成功后,开启abc.exe程序,如图所示:

gflags.exe /i 进程名.exe +ust            //添加要加载的进程

利用UMDH创建Heap快照,程序运行一段时间后或者程序占用内存增加时,然后再次创建heap快照,命令行无差别,snap1.log改为snap2.log或者其他。

umdh -pn: 进程名.exe -f:snap1.log          // snap1.log:快照名称,可改名,可设置路径,设置路径为:umdh -pn:OPCServer.exe -f:d:\Snap1.log 

使用分析差异命令,生成的result.txt文件在 命令行同目录下

umdh -d snap1.log snap2.log -f:result.txt         //比较两次快照的分析结果

生成完成后可以在文件夹下查看两个,如图所示:

打开报告文件“result.txt“搜索”memoryleak!“,如果存在内存泄露则可以搜索到结果,如图所示:

https://img-blog.csdn.net/20150805223426038?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

分析完成后查看结果result.txt,红色为umdh定位出来的泄露点,我们在查看源代码:

https://img-blog.csdn.net/20150805223435218?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

3 使用Windbg手动分析内存泄露

启动abc.exe,打开windbg,界面如图所示:

Attach到需要分析的进程:

命令:!heap –s查看当前进程运行的所有堆的情况

https://img-blog.csdn.net/20150805223442505?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

然后F5让程序运行一段时间或者内存有明显的增加时再次通过!heap –s查看当前堆的变化,如下图

https://img-blog.csdn.net/20150805223452563?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

通过对比前后两个堆的变化,发现0x012800000该地址的堆增加的很快而其他堆没什么变化,下面进一步定位

https://img-blog.csdn.net/20150805223502327?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

命令:!heap –stat –h 查看对应对的状态,发下该堆的内存基本被长度为0x424的块占用,接下来我们在堆中搜索该进程中哪些模块占用0x424长度内存,如下图

https://img-blog.csdn.net/20150805223509901?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

命令:!heap –flt s 424, 通过搜索程序内存中的堆发现长度为424的堆被大量的占用,进一步查看时谁在使用这个地址

https://img-blog.csdn.net/20150805223517167?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

找到泄露点了,红色部分的,如果程序对应的符号对应我们可以查看内存泄露点在哪一行

https://img-blog.csdn.net/20150805223524713?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值