内存分析利器之UMDH
近两周投入分析产品的内存泄漏问题。
测试团队反馈产品在安卓平台运行时,随用户操作,应用占用的内存出现上涨的趋势,停止操作并等待一段时间之后,应用占用的内存没有下降,怀疑存在内存泄漏问题。
结合复现的情况,以及一些统计数据,初步确实存在内存泄漏的现象,每次操作都会出现20MB左右的内存无法回收。
在Windows平台来复现时,可以得到相同的现象,考虑到Windows平台上的调测工具比较丰富,因此优先在Windows平台分析问题。
团队内的Windows专家推荐使用UMDH来分析本问题。
UMDH是微软Windows SDK中的一款工具,用于分析应用程序的内存使用方面的问题,使用简单,功能强大。
Windows SDK的安装方法,见官方文档。
比如应用程序名为myapp.exe,则执行如下命令,可用于定位内存使用中存在的问题。
打开cmd窗口,执行如下命令序列:
- 为进程设置"创建用户模式 堆栈 跟踪数据库"标志。
gflags /i myapp.exe +ust
或者
gflags -i myapp.exe +ust
- 指定符号表的路径。
set _NT_SYMBOL_PATH=c:\myapp\symbols
或者
set _NT_SYMBOL_PATH=c:\myapp\symbols;srv*c:\mycache*https://msdl.microsoft.com/download/symbols
- 启动应用程序,并获取应用程序的PID,即进程号。
- 获取多次堆内存数据。
程序刚启动时,第一次操作。
umdh -p:PID -g -f:LogFile.1.txt
程序运行一段时间,执行一定量的业务操作之后,第二次操作。
umdh -p:PID -g -f:LogFile.2.txt
- 分析数据。
umdh LogFile.1.txt LogFile.2.txt > LogCompare.1.txt
- 通过分析
LogCompare.1.txt中提供的泄漏点的调用栈,对照代码,检查代码中是否存在泄漏,以及对存在代码设计修复方案。
一些经验
- umdh依赖符号表,因此需要使用debug方式编译,同时指定输出符号表。使用MSVC来构建程序,需增加如下配置。
- 在编译选项中增加
/Zi。 - 在链接选项中增加
/DEBUG /OPT:REF /OPT:ICF。
- 在编译选项中增加
- 通过umdh收集数据操作之间,尽量多次复现可能存在内存泄漏的操作,保证一次尽可能多的暴露问题,提高发现问题的效率。
- 假如程序有使用内存池,建议验证时直接使用C库提供的
malloc/memalign/free来申请、释放内存。umdh工具虽然强大,但仍然存在误报的可能性。
参考资料
- 官方介绍
- 【调优工具】UMDH分析内存泄露
- umdh工具
- Windows程序内存泄漏(Memory Leak)分析之UMDH
- 用UMDH检查C++程序内存泄露
- UMDH在内存泄露分析中的应用
- umdh windbg分析内存泄露
- 使用umdh工具检测windows进程内存泄漏
- UMDH帮助排查内存持续增长问题
内存分析利器之UMDH的更多相关文章
- Nginx日志分析利器之GoAccess
1.介绍GoAccess 是一个用来统计 Apache Web 服务器的访问日志的工具,可即时生成统计报表,速度非常快 查看的统计信息有: 统计概况,流量消耗等 访客排名 动态Web请求 静态web请 ...
- 【转载】Hadoop可视化分析利器之Hue
http://qindongliang.iteye.com/blog/2212619 先来看下hue的架构图: (1)Hue是什么? Hue是一个可快速开发和调试Hadoop生态系统各种应用的一个基 ...
- windows管理员利器之用Log Parser Studio分析IIS日志(附逐浪CMS官方命令集)
原文:windows管理员利器之用Log Parser Studio分析IIS日志(附逐浪CMS官方命令集) Log Parser Studio是一个强大的IIS图形分析工具,值得推荐. 1. 安装L ...
- 大数据并行计算利器之MPI/OpenMP
大数据集群计算利器之MPI/OpenMP ---以连通域标记算法并行化为例 1 背景 图像连通域标记算法是从一幅栅格图像(通常为二值图像)中,将互相邻接(4邻接或8邻接)的具有非背景值的像素集合提取出 ...
- C#编程利器之二:结构与枚举(Structure and enumeration)【转】
C#编程利器之二:结构与枚举(Structure and enumeration) 在上一篇文章中,介绍了类如何封装程序中的对象.而实际中,出了类可以封装对象外,结构和枚举也可以封装一些对象,本文将着 ...
- php调试利器之phpdbg
信海龙的博客 php调试利器之phpdbg 简介 PHPDBG是一个PHP的SAPI模块,可以在不用修改代码和不影响性能的情况下控制PHP的运行环境. PHPDBG的目标是成为一个轻量级.强大.易用的 ...
- Android开发利器之ActivityTracker
版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/113 Android开发利器之ActivityTracke ...
- Java高并发编程基础三大利器之CountDownLatch
引言 上一篇文章我们介绍了AQS的信号量Semaphore<Java高并发编程基础三大利器之Semaphore>,接下来应该轮到CountDownLatch了. 什么是CountDownL ...
- iOS app内存分析套路
iOS app内存分析套路 Xcode下查看app内存使用情况有2中方法: Navigator导航栏中的Debug navigator中的Memory Instruments 一.Debug navi ...
- Win下必备利器之Cmder
诚言,对于开发码字者,Mac和Linux果断要比Windows更贴心;但只要折腾下,Windows下也是有不少利器的.之前就有在Windows下效率必备软件一文中对此做了下记载:其虽没oh-my-zs ...
随机推荐
- 3dMax建模笔记(一):介绍3dMax和创建第一个模型Hello world
前言 三维模型,虽然淘宝上一抓一大把,但是三维开发人员最好还是具备一定基础的建模能力.本文用hello world模型描述基本的3dMax建模流程. 3dMax 3D Studio Max ...
- 使用paramiko模块远程连接遇到paramiko.ssh_exception.NoValidConnectionsError的解决办法
连接时报错paramiko.ssh_exception.NoValidConnectionsError, 解决办法 首先在ubuntu终端上输入:cat /etc/ssh/ssh_config,查看端 ...
- 【LeetCode二叉树#05】平衡二叉树
力扣题目链接(opens new window)](https://leetcode.cn/problems/balanced-binary-tree/) 给定一个二叉树,判断它是否是高度平衡的二叉树 ...
- Python函数每日一讲 - 简洁快速学会globals()函数
引言 在 Python 中,globals() 函数是一个强大的工具,它允许您访问全局命名空间中的所有变量和函数.本文将深入探讨 globals() 函数的语法.用法以及实际应用场景,帮助大家更好地理 ...
- AIGC下一步:如何用AI再度重构或优化媒体处理?
让媒资中"沉默的大多数"再次焕发光彩. 邹娟|演讲者 编者按 AIGC时代下,媒体内容生产领域随着AI的出现也涌现出更多的变化与挑战.面对AI的巨大冲击,如何优化或重构媒体内容生产 ...
- 实现一个 SEO 友好的响应式多语言官网 (Vite-SSG + Vuetify3) 我的踩坑之旅
在 2023 年的年底,我终于有时间下定决心把我的 UtilMeta 项目官网 进行翻新,主要的原因是之前的官网是用 Vue2 实现的一个 SPA 应用,对搜索引擎 SEO 很不友好,这对于介绍项目的 ...
- Zabbix“专家坐诊”第195期问答汇总
问题一 Q:麻烦请教一下zabbix服务器总是上报这几个告警,需要处理嘛?怎么处理? A:同步历史数据进程负载过高的话会影响到server的性能,建议增加服务器硬件配置. Q:是需要增加哪方面的配置, ...
- 分支合并规则 dev master v1.0.XX 三条分支的合并原则
分支合并规则 dev master v1.0.XX 三条分支的合并原则
- C#中的JSON序列化方法
在C#中的使用JSON序列化及反序列化时,推荐使用Json.NET--NET的流行高性能JSON框架,当然也可以使用.NET自带的 System.Text.Json(.NET5).DataContra ...
- ubuntu 14.04 x86_64编译安装Skyeye1.3.5RC1的心得
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文发布于 2014-11-09 09:19:03 ...