使用按键精灵+umdh定位内存泄露问题的方式

使用按键精灵+umdh定位内存泄露问题的方式

一、配置方法

1、 安装windbg版本,必须安装:X86 Debuggers And Tools-x86_en-us.msi

2、 安装windows相关pdb和客户端程序对应的pdb。

a) 比如:F:\symbols下创建两个目录,windows存放操作系统pdb,
pdb目录存放播放器pdb。Pdb一定要与运行的播放器版本完全匹配,否则定位结果没意义

3、 配置环境变量

a) 将windbg的路径配置到path环境变量中

path=C:\Program Files\Windows Kits\8.0\Debuggers\x86

b) 配置umdh使用的symbols目录

c) 配置gflags标记

在命令行输入gfalgs,按下图方式配置

 

4、 按键精灵配置

a) 录制脚本。注意脚本必须是从初始页面开始最终回到初始界面。(比如从登陆页面开始,经过一系列操作后,最终回到登陆界面。)

b) 录完,双击脚本,在最后增加以下几行内容,catch_memory_snapshot.bat参考下面的附件。注意,例子里是将bat脚本放到D:\umdh目录下。脚本里抓取的快照也是存放在D:\umdh目录下的。


Delay 1883

RunApp "D:\umdh\catch_memory_snapshot.bat"

Delay 5000

看上去像这样

5、 验证配置结果是否正确

使用umdh命令对比两次快照结果。

umdh 2015-05-09-17-14.txt 2015-05-09-17-21.txt -f:result.txt

二、查看result.txt的结果

1) 能看到pdb加载成功

2) 能定位到代码行位置

三、附件

供按键精灵调用的脚本catch_memory_snapshot.bat,功能定时抓取内存信息生成对比信息

for /f "tokens=1,2,3 delims=/-" %%a in ('date /t') do (
 set yyyy=%%a
 set mm=%%b
 set dd=%%c
)
set Date=%yyyy:~-4%-%mm%-%dd:~0,2%
Time=`time /t`

::格式为Year-Month-Day-Hour-Minute
if "%Time:~0,1%" neq " "  (
set DateTime=%Date%-%Time:~0,2%-%Time:~3,2%) else (
if "%Time:~1,1%" neq " "  (
set DateTime=%Date%-0%Time:~1,1%-%Time:~3,2%) 	else (
set DateTime=%Date%-%Time:~0,2%-%Time:~3,2%
))

umdh -pn:iexplore.exe -f:D:\\umdh\\%DateTime%.txt
时间: 2024-09-29 02:30:10

使用按键精灵+umdh定位内存泄露问题的方式的相关文章

FastMM 定位内存泄露的代码位置

FastMM 定位内存泄露的代码位置 开源的FastMM,使用很简单,在工程的第一行引用FastMM4即可(注意,一定要在第一个Uses的位置),可以在调试程序时提示内存泄露情况,还可以生成报告. 在Delphi2007以后版本中,使用更加简单,只需要在工程开始的位置加上语句: ReportMemoryLeaksOnShutdown := True;就可以了,并且在运行时不会出现提示.如果想要生成文件报告,还需要FastMM4,Delphi中没有别的设置可以生成文件报告. 可以修改FastMM4

利用linux的mtrace命令定位内存泄露(Memory Leak)

  一谈到内存泄露, 多数程序员都闻之色变. 没错, 内存泄露很容易引入, 但很难定位.  以你我的手机为例(假设不经常关机), 如果每天泄露一些内存, 那么开始的一个星期, 你会发现手机好好的, 当内存泄露积累到一定程度,  那就是各种卡死了, 系统异常, 最后死机, 不得不重启.         如果搞开发, 遇到内存泄露问题, 那就呵呵了. 你可能先得花好几天来复现问题(泄露积累), 然后需要花好几天来定位问题和修改问题, 然后又要花好几天来验证问题, 而且, 很有可能没法一次改好, 上述

Android内存泄露总结(附内存检测工具)

Java 中的内存分配 主要是分三块: 静态储存区:编译时就分配好,在程序整个运行期间都存在.它主要存放静态数据和常量. 栈区:当方法执行时,会在栈区内存中创建方法体内部的局部变量,方法结束后自动释放内存. 堆区:通常存放 new 出来的对象.由 Java 垃圾回收器回收. 栈与堆的区别 栈内存用来存放局部变量和函数参数等.它是先进后出的队列,进出一一对应,不产生碎片,运行效率稳定高.当超过变量的作用域后,该变量也就无效了,分配给它的内存空间也将被释放掉,该内存空间可以被重新使用. 堆内存用于存

Android 和 Java 内存泄露检测工具——LeakCanary

LeakCanary Android 和 Java 内存泄露检测. "A small leak will sink a great ship." - Benjamin Franklin 千里之堤, 毁于蚁穴. -- <韩非子·喻老> demo 一个非常简单的 LeakCanary demo: https://github.com/liaohuqiu/leakcanary-demo 开始使用 在 build.gradle 中加入引用,不同的编译使用不同的引用: depende

关于SetProcessWorkingSetSize方法的疑问 内存泄露

问题描述 使用SetProcessWorkingSetSize方法可以将进程占用的物理内存换出到虚拟内存中,这样做的好处是什么呢?难道就是为了换来程序消耗的内存很小的假象吗?使用SetProcessWorkingSetSize方法是否可以解决程序因内存不足而导致崩溃的问题呢?通过查阅资料,个人对这个方法持怀疑态度:因为网上资料说,该方法只是暂时的将应用程序占用的内存移至虚拟内存,一旦,应用程序被激活或者有操作请求时,这些内存又会被重新占用.所以我认为,就算将部分内存交换至虚拟内存,只要程序被使用

按键精灵:用自己的方式快乐游戏!

大家知道什么是真正的玩游戏吗?什么东西是超越等级,装备,金钱之上的快乐?其实有很多,只是你没有留意罢了!陪朋友坐在游戏中的海边聊聊天不是玩游戏吗?篝火旁边跳跳舞难道不是玩游戏吗? 图1 但是玩久了就会发现,人们在游戏中有时比现实还要忙碌.他们总是说,不行,时间有限,我还要做任务呢--我还要升级呢-- 我还要打钱呢--玩游戏就是为了追求这些吗?为了网络游戏中那些虚无缥缈的东西,让自己在下班后依然保持忙碌状态.当游戏让人变成电脑前的机器时,这或许已经不再是游戏了! 那么如何改变这种状态呢?让网络游戏

Android 优化Handler防止内存泄露

Android 优化Handler防止内存泄露 Demo描述: Handler可能导致的内存泄露及其优化 1 关于常见的Handler的用法但是可能导致内存泄露 2 优化方式请参考BetterHandler和BetterRunnable的实现 package cc.cc; import java.lang.ref.WeakReference; import android.os.Bundle; import android.os.Handler; import android.os.Messag

穆客带你快速定位Node.js内存泄露

在7月7日的云栖TechDay活动上,来自阿里云的穆客给大家分享了<如何快速定位Node.js内存泄露>话题.此次分享主要包括Node.js和APM的简单介绍.Node.js内存管理.Node.js内存泄露及其排查过程四个方面. 下面是现场分享观点整理. 大家好,我是来自阿里云的穆客,今天分享的是关于Node.js方面的故障排查.内存泄露的话题. Node.js和APM 很多人应该都知道Node.js,它是一个运行于服务端的基于Chrome V8引擎的 JavaScript 运行环境,Node

如何定位native内存泄露问题?

问题描述 环境:WinXP + SUN JDK 6.0 + RCP + AutoMan(Rational Functional Tester)问题描述: 测试人员用AutoMan(测试部自主开发的一套Java自动化测试工具,封装IBM的RFT)对RCP应用程序进行GUI自动化测试.运行一段时间后,程序出现异常:部分操作无法进行.异常日志如下:java.lang.OutOfMemoryError: unable to create new native threadat java.lang.Thr