umdh windbg分析内存泄露
A.利用工具umdh(user-mode dump heap)分析:此处以程序MemoryLeak.exe为例子
1、开启cmd
键入要定位内存泄露的程序gflags.exe /i memroyleak.exe +ust,如图成功后,开启memoryleak.exe程序。
2、利用UMDH创建Heap快照
命令格式:umdh -pn:memoryleak.exe -f:snap1.log
程序运行一段时间后或者程序占用内存增加时,然后再次创建heap快照,命令行无差别,snap1.log改为snap2.log或者其他。
3、设置好程序的符号路径,如下图
4、设置好后可以开始分析heap前后两个快照的差异
分析差异命令:umdh -d snap1.log snap2.log -f:result.txt,生成的result.txt文件在 命令行同目录下,这里是 D:\WinDDK\7600.16385.0\Debuggers
分析完成后查看结果result.txt,红色为umdh定位出来的泄露点,我们在查看源代码:
这样我们就可以修改代码中内存泄露的地方了。
B、内存泄露实例分析
两次快照差异文件实例大致如下:
// Debug library initialized ...
D0000-111FFF DBGHELP: Server - private symbols & lines
C:\FunctionServer\Release\Server.pdb
77E70000-77FEFFFF DBGHELP: ntdll - public symbols
c:\mysymbol\wntdll.pdb\B081677DFC724CC4AC53992627BEEA242\wntdll.pdb
。。。。
等等符号加载信息 紧接着是内存泄露信息格式说明
//
// Each log entry has the following syntax:
//
// + BYTES_DELTA (NEW_BYTES - OLD_BYTES) NEW_COUNT allocs BackTrace TRACEID
// + COUNT_DELTA (NEW_COUNT - OLD_COUNT) BackTrace TRACEID allocations
// ... stack trace ...
//
// where:
//
// BYTES_DELTA - increase in bytes between before and after log
// NEW_BYTES - bytes in after log
// OLD_BYTES - bytes in before log
// COUNT_DELTA - increase in allocations between before and after log
// NEW_COUNT - number of allocations in after log
// OLD_COUNT - number of allocations in before log
// TRACEID - decimal index of the stack trace in the trace database
// (can be used to search for allocation instances in the original
// UMDH logs).
// 接着是具体的内存泄露信息 + 47e0 ( - 232a58) 1f9 allocs BackTrace8E5CFAC
+ ( 1f9 - 1f5) BackTrace8E5CFAC allocations ntdll!RtlAllocateHeap+
Server!malloc+ (f:\dd\vctools\crt\crtw32\heap\malloc.c, )
Server!operator new+1D (f:\dd\vctools\crt\crtw32\heap\new.cpp, )
Server!CUi::AddItemText+ (d:\projects\testtest\common\uilibf, )
Server!CUi::AddItemInt+ (d:\projects\testtest\common\uilibf, )
Server!CMainWin::AddOneFunction+1FE (d:\projects\testtest\server\server\, )
Server!CTest::FunctionPcInfo+3F9 (d:\projects\testtest\server\server\, )
Server!CTest::FunctionReadDispatch+15D (d:\projects\testtest\server\server\, )
Server!CTest::FunctionReadCallback+ (d:\projects\testtest\server\server\, )
Server!CWSAAsync::ReadProc+10F (d:\projects\testtest\common\wsaasyncselect, )
Server!CWSAAsync::ReadProcMiddle+ (d:\projects\testtest\common\wsaasyncselect, )
Server!CWindowsPool::ReadThreadPoolCallback+ (d:\projects\testtest\common\wsaasyncselect, )
ntdll!TppWorkpExecuteCallback+10F
ntdll!TppWorkerThread+
kernel32!BaseThreadInitThunk+E
ntdll!__RtlUserThreadStart+
ntdll!_RtlUserThreadStart+1B 。。。。
等等其他内存泄露块信息
根据格式的说明可得到此泄露信息如下:
第一行:+ 47e0 ( 237238 - 232a58) 1f9 allocs BackTrace8E5CFAC
BackTrace8E5CFAC是这个内存块的标记 237238是生成日志文件2时该内存块的大小 232a58是生成日志文件1该内存块的大小 差值47e0 是内存泄露的字节数 1f9是分配内存的次数 (其中47e0 个人理解为申请内存未释放的字节数,因为有可能是释放的时间未到就生成日志文件2 造成只有申请内存 没有释放的情况 所以被判定为内存泄露 关于这点只是个人意见 不一定正确) 。
第二行:+ 4 ( 1f9 - 1f5) BackTrace8E5CFAC allocations
BackTrace8E5CFAC是内存块标记和第一行一样,1f9是生成日志文件2时该内存分配的次数, 1f5是生成日志文件1时该内存分配的次数 差值4是这次该内存块分配的次数。
其他行:是函数调用堆栈,通过分析自己的程序发现,第三行的 Server!CUi::AddItemText+129 (d:\projects\testtest\common\uilibf, 611) 也是内存泄露所在,对应源代码是:pItemLabel = new CLabelUI; 这样基本上就定位到问题所在了
验证一下观点:每一次分配的大小是47e0 /4=4600(十进制), 程序中代码验证了sizeof(CLabelUI)也等于4600, 看来从日志1 到日志2 过程中这个地方new了4次 但是在日志2时 还未释放这些内存 所以造成内存比较时 会定位处该块内存的泄露,至于是否真泄露还是要看程序逻辑,但是既然已定位到该代码 还是要仔细分析一下 看看是逻辑问题 还是真忘了释放内存。
B.Windbg手动分析内存泄露
1、全局标志设置,参照上边的设置
2、Windbg调试泄露
开启memoryleak.exe程序,windbg attach到该进程:
命令:!heap –s查看当前进程运行的所有堆的情况
然后F5让程序运行一段时间或者内存有明显的增加时再次通过!heap –s查看当前堆的变化,如下图
通过对比前后两个堆的变化,发现0x012800000该地址的堆增加的很快而其他堆没什么变化,下面进一步定位
命令:!heap –stat –h 查看对应对的状态,发下该堆的内存基本被长度为0x424的块占用,接下来我们在堆中搜索该进程中哪些模块占用0x424长度内存,如下图
命令:!heap –flt s 424, 通过搜索程序内存中的堆发现长度为424的堆被大量的占用,进一步查看时谁在使用这个地址
找到泄露点了,红色部分的,如果程序对应的符号对应我们可以查看内存泄露点在哪一行
umdh windbg分析内存泄露的更多相关文章
- 如何用windbg分析内存泄露
1. 必须在命令行中设置为要分析的进程打开用户堆栈信息:C:\Program Files\Debugging Tools for Windows (x64)>gflags.exe -i ...
- Android 性能优化之使用MAT分析内存泄露问题
我们平常在开发Android应用程序的时候,稍有不慎就有可能产生OOM,虽然JAVA有垃圾回收机,但也不能杜绝内存泄露,内存溢出等问题,随着科技的进步,移动设备的内存也越来越大了,但由于Android ...
- Eclipse Memory Analyzer 分析内存泄露
OutOfMemoryError示例 代码 package com.walson.heap; import java.util.ArrayList;import java.util.List; /** ...
- Android 性能优化之使用MAT分析内存泄露
转载请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/42396507),请尊重他人的辛勤劳动成果,谢谢! 我们平常 ...
- 使用MAT分析内存泄露
使用MAT分析内存泄露 对于大型服务端应用程序来说,有些内存泄露问题很难在测试阶段发现,此时就需要分析JVM Heap Dump文件来找出问题.随着单机内存越来越大,应用heap也开得越来越大,动辄十 ...
- 强大的windbg定位内存泄露,两句命令搞定!
1.简单配置在windbg程序目录下有个gflags.exe,运行后设置: 运行CMD.EXE,输入"D:\Debugging Tools for Windows (x86)\gflags. ...
- 使用AndroidStudio dump heap,再用 Eclipse MAT插件分析内存泄露
1.eclipse mat插件的安装 Help->Install new software,如下图,一直下一步即可 2.AndroidStudio dump heap 3.AndroidStud ...
- jvm分析内存泄露
首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 Java小组 工具资源 - 导航条 - 首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 Java小组 工具资源 ...
- jmap命令结合mat插件分析内存泄露--OQL
http://smallnetvisitor.iteye.com/blog/1826434 User.java package gc; import java.util.ArrayList; impo ...
随机推荐
- MySQL 百万级分页优化(Mysql千万级快速分页)(转)
http://www.jb51.net/article/31868.htm 以下分享一点我的经验 一般刚开始学SQL的时候,会这样写 复制代码 代码如下: SELECT * FROM table OR ...
- 云服务器 ECS Linux Ubuntu 主机修改主机名
云服务器 ECS Linux 主机修改主机名 修改云服务器 ECS Linux 主机名常见的有两种方式,本文对此进行概要说明. 临时生效修改 使用命令行修改 hostname 主机名(可自定义),重新 ...
- oauth2-server-php-docs 概念
PHP的OAuth2服务器库 将OAuth2.0干净地安装到您的PHP应用程序中. 从GitHub 下载代码开始. 要求 这个库需要PHP 5.3.9+.然而,有一个稳定的版本和开发分支的PHP 5. ...
- MongoDB数据库遭大规模勒索攻击,被劫持26000多台服务器 #精选GITHUBMYSQL
昨天,一个大新闻爆出,MongoDB数据库叕被攻击了.就在上周末,三个黑客团伙劫持了MongoDB逾26000多台服务器,其中规模最大的一组超过22000台. “MongoDB启示录”再临? 此次 ...
- Android 演示 Android ListView 和 github XListView(1-3)
本文内容 环境 项目结构 演示 1:ListView 演示 2:简单 XListView 演示 3:音乐列表 XListView 演示 4:另一个音乐列表 XListView 本文四个演示,循序渐进. ...
- mssql 统计
这篇文章主要为大家按日,星期,月,季度,年统计销售额的sql语句,需要的朋友可以参考下 --按日,统计本月数据 select sum(payable_amount) as 金额,day([paymen ...
- JAVA中JDBC连接Mysql数据库简单测试
一.引用库 maven库:mysql:mysql-connector-java:6.0.6 二.SDK环境 JAVA JDK10 三.测试代码 package com.mysql.mysqlconne ...
- 创建Python程序
1. 创建Python程序 欢迎来到Python世界! 本系列文章告诉你怎么样编写Python程序.Python仅仅是一种文本文件.跟普通文本文件是一样的,仅仅只是这样的文本文件不但能够看,还能够在P ...
- 算法笔记_204:第四届蓝桥杯软件类决赛真题(Java语言C组)
目录 1 好好学习 2 埃及分数 3 金蝉素数 4 横向打印二叉树 5 危险系数 6 公式求值 前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 好好学习 汤姆跟爷爷来中国旅游.一天,他帮助中国的 ...
- jqPlot图表插件学习之柱形图和旋转分类名称
一.准备工作 首先我们需要到官网下载所需的文件: 官网下载(笔者选择的是jquery.jqplot.1.0.8r1250.zip这个版本) 然后读者需要根据自己的情况新建一个项目并且按照如下的方式加载 ...