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!“,如果存在内存泄露则可以搜索到结果,如图所示:
分析完成后查看结果result.txt,红色为umdh定位出来的泄露点,我们在查看源代码:
3 使用Windbg手动分析内存泄露
启动abc.exe,打开windbg,界面如图所示:
Attach到需要分析的进程:
命令:!heap –s查看当前进程运行的所有堆的情况
然后F5让程序运行一段时间或者内存有明显的增加时再次通过!heap –s查看当前堆的变化,如下图
通过对比前后两个堆的变化,发现0x012800000该地址的堆增加的很快而其他堆没什么变化,下面进一步定位
命令:!heap –stat –h 查看对应对的状态,发下该堆的内存基本被长度为0x424的块占用,接下来我们在堆中搜索该进程中哪些模块占用0x424长度内存,如下图
命令:!heap –flt s 424, 通过搜索程序内存中的堆发现长度为424的堆被大量的占用,进一步查看时谁在使用这个地址
找到泄露点了,红色部分的,如果程序对应的符号对应我们可以查看内存泄露点在哪一行