内存分析利器之UMDH

铁佛  金牌会员 | 2024-3-14 22:51:41 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 902|帖子 902|积分 2706

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

  • 为进程设置"创建用户模式 堆栈 跟踪数据库"标志。
  1. gflags /i myapp.exe +ust
  2. 或者
  3. gflags -i myapp.exe +ust
复制代码

  • 指定符号表的路径。
  1. set _NT_SYMBOL_PATH=c:\myapp\symbols
  2. 或者
  3. set _NT_SYMBOL_PATH=c:\myapp\symbols;srv*c:\mycache*https://msdl.microsoft.com/download/symbols
复制代码

  • 启动应用程序,并获取应用程序的PID,即进程号。
  • 获取多次堆内存数据。
  1. 程序刚启动时,第一次操作。
  2. umdh -p:PID -g -f:LogFile.1.txt
  3. 程序运行一段时间,执行一定量的业务操作之后,第二次操作。
  4. umdh -p:PID -g -f:LogFile.2.txt
复制代码

  • 分析数据。
  1. 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工具虽然强大,但仍然存在误报的可能性。
参考资料

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

铁佛

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表