首页 > 系统相关 >内存分析利器之UMDH

内存分析利器之UMDH

时间:2023-12-31 19:12:10浏览次数:42  
标签:泄漏 Windows 利器 内存 UMDH txt umdh

近两周投入分析产品的内存泄漏问题。
测试团队反馈产品在安卓平台运行时,随用户操作,应用占用的内存出现上涨的趋势,停止操作并等待一段时间之后,应用占用的内存没有下降,怀疑存在内存泄漏问题。
结合复现的情况,以及一些统计数据,初步确实存在内存泄漏的现象,每次操作都会出现20MB左右的内存无法回收。
在Windows平台来复现时,可以得到相同的现象,考虑到Windows平台上的调测工具比较丰富,因此优先在Windows平台分析问题。
团队内的Windows专家推荐使用UMDH来分析本问题。
UMDH是微软Windows SDK中的一款工具,用于分析应用程序的内存使用方面的问题,使用简单,功能强大。
Windows SDK的安装方法,见官方文档

比如应用程序名为myapp.exe,则执行如下命令,可用于定位内存使用中存在的问题。

打开cmd窗口,执行如下命令序列:

  1. 为进程设置"创建用户模式 堆栈 跟踪数据库"标志。
gflags /i myapp.exe +ust
或者
gflags -i myapp.exe +ust
  1. 指定符号表的路径。
set _NT_SYMBOL_PATH=c:\myapp\symbols
或者
set _NT_SYMBOL_PATH=c:\myapp\symbols;srv*c:\mycache*https://msdl.microsoft.com/download/symbols
  1. 启动应用程序,并获取应用程序的PID,即进程号。
  2. 获取多次堆内存数据。
程序刚启动时,第一次操作。
umdh -p:PID -g -f:LogFile.1.txt

程序运行一段时间,执行一定量的业务操作之后,第二次操作。
umdh -p:PID -g -f:LogFile.2.txt
  1. 分析数据。
umdh LogFile.1.txt LogFile.2.txt > LogCompare.1.txt
  1. 通过分析LogCompare.1.txt中提供的泄漏点的调用栈,对照代码,检查代码中是否存在泄漏,以及对存在代码设计修复方案。

一些经验

  1. umdh依赖符号表,因此需要使用debug方式编译,同时指定输出符号表。使用MSVC来构建程序,需增加如下配置。
    1. 在编译选项中增加/Zi
    2. 在链接选项中增加/DEBUG /OPT:REF /OPT:ICF
  2. 通过umdh收集数据操作之间,尽量多次复现可能存在内存泄漏的操作,保证一次尽可能多的暴露问题,提高发现问题的效率。
  3. 假如程序有使用内存池,建议验证时直接使用C库提供的malloc/memalign/free来申请、释放内存。umdh工具虽然强大,但仍然存在误报的可能性。

参考资料

标签:泄漏,Windows,利器,内存,UMDH,txt,umdh
From: https://www.cnblogs.com/jackieathome/p/17937698

相关文章

  • 结构体变量的定义和初始化、结构体内存对齐——《初学C语言第44天》
    //////5.——————结构体变量的定义和初始化////——定义////方式1//structPoint//{// intx;// inty;//}p1;//声明类型的同时定义变量p1////方式2//structPoint//{// intx;// inty;//};//intmain()//{// structPointp2;//定义结构体变量p2// return0......
  • 05 QT上位机读写FPGA内存
    软件版本:vitis2021.1(vivado2021.1)操作系统:WIN1064bit硬件平台:适用XILINXA7/K7/Z7/ZU/KU系列FPGA登录"米联客"FPGA社区-www.uisrc.com视频课程、答疑解惑!5.1概述如果读者对于前面demo还有一些疑惑,那么本节课的内容,可以让你更加简单地弄明白什么是BAR地址空间操作,什么是对......
  • CSS语法检查利器之csslint
    本文于2015年底完成,发布在个人博客网站上。考虑个人博客因某种原因无法修复,于是在博客园安家,之前发布的文章逐步搬迁过来。背景前段时间研究使用YUICompressor压缩项目里的js和css文件,研究了两天之后,终于在周三晚上把YUICompressor集成进了打包流程中;于是周四(2015-11-12)早晨......
  • 2023年度评奖:内存篇
    2023年内存市场的主旋律就是高频。仅仅在2年前,主流DDR5内存才还只有4800~5600MHz,而如今6800MHz16GBx2套条已经降到了699元,千元以下的7200MHz也有不少,8000MHz可选型号也不下十数款。回想起酷睿12代发布时DDR5-48008GB高达千元的售价,只能感叹世界变化之快,让人难以预料。至于更......
  • 沃飞长空AE200型eVTOL,将成为下一个出行利器
    随着科技的发展,人类对出行方式的探索已经超越了地面的限制,要想人人都开飞机出行,想必是不太现实的。于是飞行汽车逐渐成为了人们关注的焦点。沃飞长空(AEROFUGIA)是吉利旗下一家以低空交通业务为核心的科技公司,致力于全球低空智慧交通商业化运营,打造创新跨界的科技产品,围绕低空交通......
  • JVM-实战篇-内存调优
    1内存溢出和内存泄漏概念:内存泄漏:在Java中如果不在使用一个对象,但是该对象依然在GCROOT的引用链上,这个对象就不会被垃圾回收器回收,这种情况就称之为内存泄漏。内存泄漏绝大多数情况都是由堆内存泄漏引起的,所以后续没特殊说明讨论的均为堆内存泄漏。若持续发生内存泄漏,不管有......
  • Java虚拟机内存模型概念
    Java虚拟机内存模型概念  Java虚拟机的内存可以分为三个区域:栈stack、堆heap、方法区methodarea  一、栈stack  1. 栈描述的是方法执行的内存模型,每个方法被调用都会创建一个栈帧(存储局部变量、操作数、方法出口等)  2.JVM为每个线程创建一个栈,用于存放该线程执......
  • 恒创科技:如何合理配置云服务器的CPU和内存?
    ​提到云服务器性能,大抵有两个主要影响因素,CPU核心数量和内存容量,它们决定了云服务器的速度和可靠性。日常运用中,我们如何判断网站需要需要更多或更少?如何扩大或缩小它们以优化网站的性能?一般来说,您拥有的RAM和CPU核心越多,可以同时运行的进程就越多,您的网站对访问......
  • [转发] Go pprof内存指标含义备忘录
    原文链接Gopprof内存指标含义备忘录最近组内一些Go服务碰到内存相关的问题,所以今天抽时间看了下Gopprof内存指标的含义,为后续查问题做准备。内容主要来自于Go代码中对这些字段的注释,加自己的理解。理解不对的地方欢迎指正。//https://github.com/golang/go/blob/master/src......
  • vue前端node内存溢出问题解决
    前端项目运行时,如果经常运行慢,崩溃停止服务,报如下错误:FATALERROR:CALL_AND_RETRY_LASTAllocationfailed-JavaScriptheapoutofmemory(JavaScript堆内存不足) 原因:因为在Node中,通过JavaScript使用内存时只能使用部分内存(64位系统:1.4GB,32位系统:0.7GB),这个时候,如......