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

1 下载与安装

1.1 软件介绍

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

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

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

1.2 软件下载

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

进入页面,如图所示:

Umdh进行内存泄露分析软件的下载、安装与使用_第1张图片

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

Umdh进行内存泄露分析软件的下载、安装与使用_第2张图片

Umdh进行内存泄露分析软件的下载、安装与使用_第3张图片

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

1.3 软件安装

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

Umdh进行内存泄露分析软件的下载、安装与使用_第4张图片

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

Umdh进行内存泄露分析软件的下载、安装与使用_第5张图片

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

Umdh进行内存泄露分析软件的下载、安装与使用_第6张图片

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

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

Umdh进行内存泄露分析软件的下载、安装与使用_第7张图片

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

Umdh进行内存泄露分析软件的下载、安装与使用_第8张图片

Umdh进行内存泄露分析软件的下载、安装与使用_第9张图片

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“,则配置应该为下图所示:

Umdh进行内存泄露分析软件的下载、安装与使用_第10张图片

保存后便配置完成了。

2 使用umdh自动分析

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

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

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

Umdh进行内存泄露分析软件的下载、安装与使用_第11张图片

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

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

Umdh进行内存泄露分析软件的下载、安装与使用_第12张图片

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

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

Umdh进行内存泄露分析软件的下载、安装与使用_第13张图片

使用分析差异命令,生成的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,界面如图所示:

Umdh进行内存泄露分析软件的下载、安装与使用_第14张图片

Attach到需要分析的进程:

Umdh进行内存泄露分析软件的下载、安装与使用_第15张图片

Umdh进行内存泄露分析软件的下载、安装与使用_第16张图片

命令:!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

你可能感兴趣的:(C++,c++,内存泄露,umdh,开发语言)