资源泄漏日志采集及分析工具mem-analyzer概览和使用指导

0 评论 699 浏览 0 收藏 18 分钟

本原创文章帖发布在华为开发者联盟社区,欢迎开发者前往访问评论交流,更多与该内容相关讨论,请点击原帖查看:

资源泄漏日志采集&分析工具mem-analyzer概览和使用指导-华为开发者话题 | 华为开发者联盟

 

1、 mem-analyzer工具概览

① 工具下载:

https://gitcode.com/ancimoon/developtools_dfx_mem_analyzer/releases

② 源码下载:

https://gitcode.com/ancimoon/developtools_dfx_mem_analyzer

③ 使用指导:

https://gitcode.com/ancimoon/developtools_dfx_mem_analyzer/blob/master/docs/usage.md

1.1 为什么需要一个资源泄漏日志采集与分析工具

资源泄漏日志采集的痛点

• 快照采集:hidumper –mem-jsheap 功能多,但是使用门槛高。需要熟悉使用哪些参数,什么时间采集完成,日志存放在哪里,如何导出等。

• 内存Trace采集: hiprofiler命令行和IDE工具参数多(几十个参数),使用门槛高。不知道如何配置才能达到最优效果,NativeHeap、Global/LocalHandle、DMA、FD不同类型日志怎么采集也比较复杂。

资源泄漏日志分析的痛点

• 入门难拿到一堆工具和日志文件,不知道如何开始。

• 数据多内存trace和ArkTS堆中有海量数据,找不到重点。

• 分析难依赖专家经验,不知道日志中哪些信息代表可能有泄漏。

• 自动化难:需写脚本分析各种日志格式,难以集成到已有的企业流水线和个人工具流程中。

mem-analyzer:一条命令,从采集到分析全链路覆盖

       • 统一采集六种内存资源

       • 自动识别泄漏热点

       • 生成交互式HTML报告

       • 支持ArkTS/Native/Handle分析

       • 流水线可集成

1.2 mem-analyzer功能全景介绍

六大采集类型 · 三大分析引擎

1.3 引用链分析方法,根据根节点类型和引用路径完成问题分析

引用链:起点是根节点对象,结束点是实例对象,中间节点是引用路径,找到关键引用节点,解除引用关系。

关键分析

       • ArkUI组件与ArkTS对象分析:相关组件和对象生命周期已经结束,GC后未释放组件,建议根据引用链,找到关键节点,及时解除引用关系,避免泄漏。

       • 最短引用链分析:建议根据大小和数量等信息, 找到TOP疑点对象,然后再根据引用链,找到关键节点,及时解除引用关系,避免泄漏

1.4 调用链分析方法,火焰图与冰柱图:可视化调用泄漏分布

火焰图即上层调用链,冰柱图即下层调用链, 从顶层到底层即可看出函数调用关系,顶层是起始点。

火焰图(Flame Graph)· 自顶向下

冰柱图(Icicle Graph)· 自顶向下

关键分析

宽度代表泄漏量:方块越宽,该函数路径的泄漏越大。

点击缩放:点击任意方块可放大该调用路径,查看更详细的子调用;右键可复制符号名和调用链。

两种视图互补:火焰图适合看“谁调用了目标函数分配了内存”,冰柱图适合看“目标函数调用谁分配了内存”。

实际样例

2、效果展示与案例分析

2.1 ArkTS快照日志采集分析

2.1.1 效果示例1:采集ArkTS快照,分析组件泄漏和TOP引用链

 # 导出“泄漏演示”测试应用的ArkTS堆快照,自动分析后打开报告,工具会根据应用名称自动查询包名。

 mem-analyzer profiler 泄漏演示 -c snapshot –o

注:快照导出仅支持debug签名应用

2.1.2 ArkTS快照日志泄漏分析(JsLeak)-AKUI组件/ArkTS对象泄漏分析

1. 通过对象名称聚类

2. 根据聚类后的总大小排序

3. 分析引用关系

4. 根据属性名判断组件类型

2.1.3 案例:通过引用链分析Ability组件泄漏

泄漏原因分析,Ability创建时将自身this放入一个对象的instance属性,后又将对象放入了一个数组,这个数组被模块级变量持有导致泄漏。

2.2 NativeHeap日志采集分析

2.2.1 效果示例2抓取NativeHeap内存日志,分析TOP函数与调用链

# 智能拉起应用,采集应用的内存分配栈,自动分析TOP函数与调用链,自动展示分析报告

mem-analyzer profiler 泄漏演示 -c nativeheap -o

2.2.2 Htrace日志泄漏分析-NativeHeap、DMA、FD等分析

1. 找到TOP函数,根据函数名聚类。

2. 根据聚类后的总大小排序。

3. 分析有疑点的函数的调用链,找到代码行。

2.3 ArkTS Handle日志采集分析

2.3.1 效果示例3抓取ArkTS Handle日志,分析Global/Local Handle

# 采集 local handle 日志时,会自动重启应用并采集

mem-analyzer profiler 泄漏演示 -c handle -o

注:ArkTS Handle日志导出需debug签名应用且系统版本7.0.0.102开始才支持

2.3.GlobalHandle引用ArkTS对象志分析

1. 优化基础节点名称,根据对象名聚类

2. 根据聚类后的总大小排序

3. 分析TOP对象的引用的创建堆栈(调用链)

2.3.3 案例:分析GlobalHanlde全局句柄泄漏

泄漏原因分析,通过napi接口持有了ArkTS对象的全局句柄,但是没有调用napi_delete_reference,导致对象无法释放。

2.3.LocalHandle引用ArkTS对象志分析

1. 优化基础节点名称,根据对象名聚类。

2. 根据聚类后的总大小排序。

3. 分析TOP对象的引用的创建堆栈(调用链),找到问题代码。

2.3.5 案例:分析LocalHanlde局部句柄泄漏

泄漏原因分析:在libuv中通过napi接口创建对象,创建String没有被napi_open_handle_scope包含,造成永久泄漏。

1. 通过堆栈可以找到创建相关ArkTS对象的底层函数。

2. 通过对象名可以找到具体的ArkTS对象。

2.4 已有堆快照日志分析

2.4.1 效果示例4:直接分析已有的堆快照

# 分析已导出的快照,并自动打开分析报告

./mem-analyzer jsleak ~/Downloads/hidumper-jsheap-63074-63074-1787051285526.rawheap –o

2.4.2 ArkTS快照日志泄漏分(JsLeak)-最短引用链分析

1. 优化基础节点名称,分析节点最短引用链。

2. 根据引用链聚类。

3. 根据聚类后的总大小排序,分析有疑点的节点数和引用链。

2.4.3 通过资料文档可以快速找到更多资料,通过帮助中心可以快速开始

3使用指导和模块介绍

3.1 mem-analyzer解压即用,一条命令出报告

 安装

解压对应平台压缩包即可使用:

 Windows: mem-analyzer.exe

 macOS./mem-analyzer (arm64/x86_64)

 Linux: ./mem-analyzer

 命令结构

mem-analyzer [全局选项] [子命令] [选项] <文件…>

全局选项: -d 输出目录 -p 仅解析 -o 自动打开 -f json/html

子命令: profiler / trace / tshandle / jsleak(不指定则自动检测)

 常用命令示例

# 采集60nativeheap(nh) 并自动生成报告
mem-analyzer profiler -c nh -t 60 -o com.example.app
# 自动检测文件类型并分析
mem-analyzer -o hiprofiler_data.htrace
# 分析堆快照,显示 Top 20 引用链
mem-analyzer jsleak -n 20 -o hidumper-jsheap.heapsnapshot

3.2 日志采集模块profiler

profiler:一条命令完成设备端采集与分析

 核心能力

• 环境自检:hdc可用性 / 设备连接 / API版本

• 进程名解析:支持包名或应用名模糊匹配

• 应用自动拉起,采集期间随时 Ctrl+C 停止

• -o 参数:采集后自动生成 HTML 报告并打开

 采集命令示例

# 采集60秒 nativeheap(nh),自动出报告

mem-analyzer profiler -c nh -t 60 -o 泄漏演示

# 采集 ArkTS 堆快照(应用需已运行)

mem-analyzer profiler -c snap -o com.example.app

# 列出设备上已安装的应用

mem-analyzer profiler –list-apps

采集流程四步走

3.3 ArkTS快照分析模块jsleak

jsleakArkTS堆快照泄漏分析,组件泄漏分析与最短引用链分析

三大核心分析能力

• 组件泄漏识别— 识别 isDeleting_ / _isDisposed / isDestroyed 标记的已销毁组件对象

• 最短引用链分析—计算保留大小

• 特殊对象易用改进-JSObject(增加属性数量,关键属性显示),String显示长度,Observed对象(增加显示业务对象名称)

 分析模式与命令(-m)

• all(默认)— 属性标签 + 引用链全分析

• property-tag / pt— 仅属性标签检测

• top-chain / tc— 仅最短引用链

# 分析堆快照,自动打开报告
mem-analyzer jsleak -o xxx.rawheap
# Top 20 引用链 + 自定义泄漏定义文件
mem-analyzer jsleak -n 20 -l my_leaks.jsleaklist xxx.heapsnapshot

3.4 内存分配日志分析模块trace

trace:内存分配日志(htrace)分析与泄漏热点识别

 支持的资源类型(-c)

• nativeheap — malloc/free 堆内存

• dma — DMA(ION)内存

• ashmem — 匿名共享内存

• fd — 文件描述符

• thread — 线程

 四种分析范围 (-s)

• app-only — 仅应用层符号

• system-only — 仅系统层符号

• app-and-system — 同时显示(默认)

• mixed — 跨层混合符号

 命令示例

# 仅分析应用层符号,并输出top20的结果
mem-analyzer trace -c nativeheap -s app-only -n 20 leak.htrace
# 仅解析htrace,将输出json格式的原始调用链
mem-analyzer trace -p data.htrace

分析思路:以函数为核心,先找出TOP泄漏量的函数,再构建TOP函数的上下游调用链

海量原始调用

TOP1 泄漏量函数 caller()

3.5 ArkTS Handle日志分析模块tshandle

tshandleArkTS 对象Global/LocalHandle泄漏分析

 命令示例

# 生成完整 HTML 分析报告
mem-analyzer tshandle handle_data.zip
# 仅解析输出 JSON
mem-analyzer tshandle -p -f json handle_data.zip

 6步分析流水线

让 HarmonyOS 应用告别内存泄漏,运行更加流畅稳定,欢迎随时交流提问,共同探索技术优化的无限可能。

mem-analyzer资源泄漏日志抓取与分析

—————————————————————————————————–

🔗 官网开发者学堂视频:https://developer.huawei.com/consumer/cn/training/result?type2List=201783644516849879&orderBy=1&courseType=5

🔗 社区DFX专题文章:  https://developer.huawei.com/consumer/cn/forum/subject/2101218731402391001

【扫码加入 HarmonyOS DFX 技术交流群】

本文由 @华为开发者联盟 授权发布于人人都是产品经理。未经作者许可,禁止转载

题图来自Unsplash,基于CC0协议

该文观点仅代表作者本人,人人都是产品经理平台仅提供信息存储空间服务

更多精彩内容,请关注人人都是产品经理微信公众号或下载App
海报
评论
评论请登录
  1. 目前还没评论,等你发挥!