mem-analyzer 使用手册

资源泄漏日志抓取与分析工具的完整命令行使用说明

安装

Windows

解压 mem-analyzer-{version}-win64.zip,通过命令行运行 mem-analyzer.exe

macOS

解压 mem-analyzer-{version}-macos.zip,参考 macOS运行mem-analyzer

Linux

解压 mem-analyzer-{version}-linux.tar.gz,通过命令行运行 mem-analyzer


真机演示

以下为真机演示场景,通过视频展示各场景的完整操作流程。

场景一:根据ArkTS快照日志分析组件泄漏和TOP引用链

# 选择 -o 参数,自动生成 HTML 分析报告,并在默认浏览器中打开
mem-analyzer jsleak ~/Downloads/hidumper-jsheap-63074-63074-1787051285526.rawheap -o 

支持分析单个堆快照文件,也可同时导入 jsleaklist 文件,进行组件泄漏和 TOP 引用链分析

根据ArkTS快照日志分析组件泄漏和TOP引用链

场景二:导出ArkTS快照日志分析组件泄漏和TOP引用链

# 支持按应用名匹配已安装应用,例如:泄漏演示(包名 com.example.memoryleakapplication)
mem-analyzer profiler 泄漏演示 -c snapshot -o

支持直接导出ArkTS快照日志文件并分析组件泄漏和TOP引用链

导出ArkTS快照日志分析组件泄漏和TOP引用链

场景三:抓取NativeHeap内存泄漏日志并分析TOP函数与调用链

# 如果应用未启动,会自动拉起应用并采集 htrace 日志
mem-analyzer profiler 泄漏演示 -c nativeheap -o

自动拉起应用并采集 htrace 日志,问题复现后可通过 Ctrl+C 退出采集并自动化分析,结束后自动打开分析报告

抓取NativeHeap内存泄漏日志并分析TOP函数与调用链

场景四:抓取ArkTS Handle泄漏日志并分析GlobalHandle与LocalHandle泄漏

# 采集 local handle 日志时,会自动重启应用并采集
mem-analyzer profiler 泄漏演示 -c handle -o

自动重启应用并采集 handle 日志,问题复现后可通过 Ctrl+C 退出采集并自动化分析,结束后自动打开分析报告

抓取ArkTS Handle泄漏日志并分析GlobalHandle与LocalHandle泄漏


命令总览

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

采集类

子命令 别名 用途
profiler prof 通过hdc,从连接的设备实时采集ArkTS堆快照 / htrace / ArkTS句柄日志

分析类

子命令 别名 用途
(不指定) 根据输入文件类型,自动选择子命令进行分析,并输出分析结果
trace tr 分析nativeheap/dma/fd/ashmem类型的内存维测日志(.htrace)
tshandle th 分析 ArkTS 句柄日志(.zip)
jsleak jl 分析 ArkTS堆快照(.heapsnapshot/.rawheap)

全局选项

以下选项可用于大部分的子命令:

选项 说明
-d, --out-dir DIR 输出目录,默认 out
-p, --parse-only 仅解析,跳过分析
-o, --auto-open 处理完成后自动打开结果文件
-f, --format FORMAT 输出格式:jsonhtml
-v, --version 显示版本信息并退出
-h, --help 显示帮助信息

子命令

资源日志采集

profiler — 资源日志采集

mem-analyzer profiler <bundle> [选项]

注意profiler 不分析本地文件,而是通过 hdc 连接 HarmonyOS 设备,实时采集目标进程的内存数据(快照 / htrace / 句柄日志),并按需对采集结果自动生成分析报告。

运行前置条件

  • 已安装 HarmonyOS SDK 工具链,且 hdc 已加入 PATH(可用 hdc version 验证)。
  • 设备已通过 USB 连接、开启 USB 调试(可用 hdc list targets 验证)。
  • 设备 API 版本满足采集类型要求:snapshot 需 ≥ 24,其他需 ≥ 26。
  • 采集目标必须是设备上已安装的应用。

必选选项

选项 说明
<bundle> 目标应用/进程名(包名或应用名匹配),--list-apps 时不需要

采集类型

选项 说明
-c, --category TYPE 采集类型,默认 nativeheap。可选值:nativeheap/nh/nativesnapshot/snapglobalhandle/global/ghallhandle/handle/ahlocalhandle/local/lhfddmathreadashmem

可选选项

选项 说明
-t SECONDS 采集时长(秒),默认 120
-d, --out-dir DIR 输出目录,默认 out
-S, --so-dir DIR native .so 符号表目录,离线符号化(除 snapshot 外所有采集类型生效)
--sourcemap PATH 指定工程 sourceMap 文件或目录(含 sourceMaps.map),生成报告前先还原混淆的编译产物路径为源码路径(仅 snapshot 类型生效)
--namecache PATH 指定工程 nameCache 文件或目录(含 nameCache.json),生成报告前先还原混淆的函数/属性名为原始名(仅 snapshot 类型生效)
-o, --auto-open 采集完成后自动生成 HTML 分析报告,并在默认浏览器中打开
--list-apps 列出设备上已安装的应用后退出

-o 与反解参数的联动-o 采集结束后会按采集类型自动派发分析报告——nativeheap/fd/dma/thread/ashmemtraceglobalhandle/allhandle/localhandletshandlesnapshotjsleak。此时 -S/--so-dir(native .so 反解)会透传给 trace/tshandle 报告,--sourcemap/--namecache(ArkTS 反混淆)会透传给 jsleak 报告。

进程名解析<bundle> 支持传入包名或应用名匹配。若匹配到多个应用会列出候选并要求提供更精确的名称。可先用 mem-analyzer profiler --list-apps 查看设备上的应用列表。

采集类型详情

缩写 说明 对端设备的API等级要求
snapshot snap 采集 ArkTS 虚拟机堆内存快照 >=24
nativeheap nh, native 采集 native heap 堆内存分配 >=26
globalhandle global, gh 采集ArkTS全局句柄(Global Handle)分配 >=26
localhandle local, lh 采集ArkTS局部句柄(Local Handle)分配 >=26
allhandle handle, ah 采集ArkTS局部 & 全局句柄(Local & Global Handle)分配 >=26
fd 采集文件描述符(fd)分配 >=26
dma 采集 DMA(ion)内存分配 >=26
thread 采集线程创建/销毁栈 >=26
ashmem 采集匿名共享内存(ashmem)分配 >=26

采集流程说明

  • 应用运行状态检测:
    • nativeheap/global/fd/dma/thread/ashmem 类型,若目标应用未运行,采集前,工具会通过 aa start 自动拉起。
    • local 类型,由于需要应用冷启动才能追踪到局部句柄分配,工具会在就绪后重启目标应用,然后再进行采集。
    • snapshot类型,需要应用已提前运行,否则无法抓取
  • 启动采集:
    • 工具通过hdc命令,启动htrace/ArkTS snapshot/ArkTS句柄维测抓取。
    • 在采集过程中,轮询采集状态,等待采集结束
    • 采集期间可按 Ctrl+C(macOS 为 Control+C)提前停止,工具会正常结束 hiprofiler 会话并保存已采集的数据。
  • 采集完成:
    • 收集并拉取维测日志到PC上,按需启动分析流程

使用示例

# 列出设备上已安装的应用
mem-analyzer profiler --list-apps

# 采集 native heap 堆内存(默认类型)分配栈 60 秒
mem-analyzer profiler -t 60 com.example.app 

# 采集 ArkTS 虚拟机堆快照(目标应用需已运行)
mem-analyzer profiler -c snap com.example.app 

# 采集ArkTS局部 & 全局句柄分配栈,并自动生成 HTML 报告
mem-analyzer profiler -o -c lh com.example.app 

# 采集文件描述符分配栈
mem-analyzer profiler -c fd com.example.app 

# 采集线程创建/销毁栈
mem-analyzer profiler -c thread com.example.app 

# 采集匿名共享内存分配栈
mem-analyzer profiler -c ashmem com.example.app 

输出结构

采集结果按关键导出文件的名称嵌套在 out/<result>/ 下(与分析子命令一致)。

out/<result>/
├── <采集文件>              # .htrace / .zip / .rawheap(取决于采集类型)
├── smaps_<timestamp>.txt  # smaps日志(nativeheap/global/local/dma/thread/ashmem)
├── fds_<timestamp>.txt    # fd列表日志(fd)
└── <result>.html          # 仅当指定 -o 时生成的分析报告

输出说明

采集类型 采集产物
snapshot hidumper-jsheap-* 堆快照
nativeheap mem_analyzer_hiprofiler_data_*.htrace
global / local hiprofiler_data_*.zip
fd mem_analyzer_hiprofiler_data_*.htrace
dma mem_analyzer_hiprofiler_data_*.htrace
thread mem_analyzer_hiprofiler_data_*.htrace
ashmem mem_analyzer_hiprofiler_data_*.htrace

注意-o 会调用同目录下的 mem-analyzer 二进制对采集结果执行对应分析子命令,并在分析成功后自动打开 HTML 报告。若采集内容为空,则不会生成 HTML。


资源日志分析

1. 自动检测模式

不指定子命令时,mem-analyzer 会自动检测文件类型并处理。

mem-analyzer [全局选项] <文件...>
# 自动检测&分析 .htrace 文件的nativeheap信息
mem-analyzer profile.htrace

# 自动检测&分析 .htrace 文件的nativeheap信息,并且自动打开结果文件
mem-analyzer -o profile.htrace

# 自动检测&分析 .heapsnapshot 文件
mem-analyzer snapshot.heapsnapshot

# 自动检测&分析 .zip 文件的ArkTS句柄信息
mem-analyzer handle_data.zip

2. jsleak — ArkTS 堆日志分析

mem-analyzer jsleak [选项] <输入文件>

注意jsleak 根据文件扩展名判断输入类型:.rawheap 结尾的文件会先转换为 heapsnapshot 再解析;其他扩展名直接视为 heapsnapshot 处理。

专属选项

选项 说明
-n, --top-n N 输出 Top N 引用链,默认 10
-l, --leaklist FILE 泄漏定义文件(.jsleaklist)路径
-m, --mode MODE 分析模式:all(默认)、property-tag/pttop-chain/tc
--sourcemap PATH 指定工程 sourceMap 文件或目录(含 sourceMaps.map),用于将混淆的编译产物路径还原为源码路径
--namecache PATH 指定工程 nameCache 文件或目录(含 nameCache.json),用于将混淆的函数/属性名还原为原始名
-o, --auto-open 分析完成后自动打开结果文件

输入文件.heapsnapshot.rawheap 文件。

使用示例

# 分析堆快照
mem-analyzer jsleak snapshot.rawheap

# 分析堆快照,完成后直接打开结果文件
mem-analyzer jsleak -o snapshot.rawheap

# 指定 Top-N 和泄漏定义文件
mem-analyzer jsleak -n 20 -l my_leaks.jsleaklist snapshot.heapsnapshot

# 仅属性标签分析
mem-analyzer jsleak -m pt snapshot.heapsnapshot

# 仅最短引用链分析
mem-analyzer jsleak -m tc snapshot.heapsnapshot

# 反混淆分析:使用工程 sourceMap 与 nameCache 归档目录,将混淆的函数名/属性名与编译产物路径还原为原始名/源码路径后分析
mem-analyzer jsleak --sourcemap <PATH> --namecache <PATH> snapshot.heapsnapshot

反混淆说明:指定 --sourcemap--namecache 时,解析前先在系统临时目录中对快照做还原(将混淆的函数名/属性名与编译产物路径还原为原始名/源码路径与行号);还原成功则基于还原后的快照内容解析与分析,临时产物随命令结束自动清理,不写入 --out-dir(默认 out)——out 下仅生成最终报告。未指定时行为与之前完全一致。若索引目录不存在,或目录内缺少对应索引文件(如无 sourceMaps.map / nameCache.json),仅打印告警并继续分析未还原的快照。

输出结构

out/<filename>/
└── <filename>.html

输出说明

输出 说明
<name>.html 交互式 HTML 报告,含类层级、保留大小和引用链

3. tshandle — ArkTS 句柄日志分析

mem-analyzer tshandle [选项] <文件...>

注意tshandle 子命令忽略文件扩展名,默认将输入内容视为 ZIP 格式进行处理。

专属选项

选项 说明
-d, --out-dir DIR 输出目录,默认 out
-p, --parse-only 仅解析,跳过分析
-f, --format FMT 输出格式:jsonhtml
-S, --so-dir DIR native .so 符号表目录,用于 htrace 离线符号化,缺省不反解
--sourcemap PATH sourceMap 文件或目录,用于还原 ArkTS 混淆路径/行号(缺省不还原)
--namecache PATH nameCache 文件或目录,用于还原 ArkTS 混淆名称(缺省不还原)
-o, --auto-open 分析完成后自动打开结果文件

输入文件: .zip 文件,通常包含:

  • *.htrace — 内存分配栈数据(必需,否则报错退出)
  • *.rawheap — 原始堆快照(可选,缺失时跳过 ArkTS 类分析)
  • *.binpb/*.txt — 地址映射文件(可选,缺失时跳过 ArkTS 类分析)

使用示例

# 生成完整分析 HTML 报告
mem-analyzer tshandle handle_data.zip

# 解析句柄数据为 JSON(含调用栈和 ArkTS 类分析)
mem-analyzer tshandle --parse-only -f json handle_data.zip

输出结构

out/<filename>/
└── <filename>.html          # 或 .json

输出说明

模式 格式 输出内容
分析模式 html 交互式 HTML 报告,含句柄类型分析、类表格、调用图
--parse-only json 调用栈、ArkTS 类实例、nativeRef 条目、内存摘要

4. trace — htrace日志分析

mem-analyzer trace [选项] <文件...>

注意trace 子命令忽略文件扩展名,默认将输入内容视为 htrace 格式进行处理。

专属选项

选项 说明
-c, --category CAT 资源类别:nativeheap(默认)、mmap-anondmaashmemfdthread
-s, --scope SCOPE 分析范围:app-onlysystem-onlyapp-and-system(默认)、mixed
-n, --top-n N 报告中显示 Top N 符号,默认 10
-S, --so-dir DIR native .so 符号表目录,用于离线符号化,缺省不反解
-o, --auto-open 分析完成后自动打开结果文件

-s, --scope 详细说明

控制 Top 符号列表中包含哪些层级的符号,用于聚焦特定层级的泄漏分析:

说明 适用场景
app-only 仅显示应用层符号(如 libentry.solibace.so 排查应用自身的内存泄漏
system-only 仅显示系统层符号(如 libc.solibskia.so 排查系统库或框架层泄漏
app-and-system 同时显示应用层和系统层符号(默认 全面分析,不区分层级
mixed 显示跨层混合符号(调用链同时涉及应用和系统层) 排查应用与系统交互导致的泄漏

注意-s 仅在分析模式(非 --parse-only)下生效。--parse-only 模式会输出全部资源类型的调用栈,不受 scope 影响。

资源类别说明

说明
nativeheap nativeheap堆内存分配(malloc/free)
dma DMA/ION 内存分配
ashmem 匿名共享内存
fd 文件描述符分配
thread 线程创建/销毁

使用示例

# 分析nativeheap堆,默认生成 HTML 交互报告
mem-analyzer trace -c nativeheap profile.htrace

# 分析 DMA 内存,显示 Top 20 符号
mem-analyzer trace -c dma -n 20 dma_profile.htrace

# 分析文件描述符
mem-analyzer trace -c fd -f html fd_profile.htrace

# 仅分析应用层分配
mem-analyzer trace -c nativeheap -s app-only profile.htrace

# 仅解析,提取所有调用栈到 JSON
mem-analyzer trace -p profile.htrace

输出结构

out/<filename>/
├── <filename>.json     # 或 <filename>.html

输出说明

模式 格式 输出内容
--parse-only json 所有调用栈(含解析后的符号、库名、build ID)
分析模式 json 统计摘要、Top 符号、火焰图数据
分析模式 html 交互式 HTML 报告,含火焰图、冰柱图和调用栈表格

注意--parse-only 模式下 -c 参数不影响输出(会输出全部资源类型的调用栈)。


支持的文件类型

扩展名 对应子命令 说明
.htrace trace Hiprofiler 原生内存追踪
.zip tshandle ArkTS 句柄日志包(htrace + 堆快照)
.heapsnapshot jsleak ArkTS 堆快照
.rawheap jsleak 原始堆数据(自动转换为 heapsnapshot)

输出目录结构

指定 -d out 后,输出文件会嵌套在 out/<输入文件名>/ 下,文件名与输入文件相同(仅扩展名变化)。

示例:假设有三个输入文件 native.htracehandle_data.zipsnapshot.heapsnapshot,输出结构如下:

out/
├── native/                   # 目录名 = 输入文件名
│   ├── native.html           # 输出文件名 = 输入文件名 + .html
│   └── native.json           # 或 .json
├── handle_data/
│   └── handle_data.html
└── snapshot/
    └── snapshot.html

说明nativehandle_datasnapshot 仅为示例,实际目录名取决于输入文件名称。


查看版本

mem-analyzer --version
# mem-analyzer version 0.2.5

常用场景

场景一:ArkTS堆快照分析

# 1. 分析并生成html报告
mem-analyzer app.rawheap

# 2. 分析并生成html报告,显示 Top 20 符号
mem-analyzer jsleak -n 20 snapshot.heapsnapshot

# 3. 分析并生成html报告,并自动打开结果文件
mem-analyzer jsleak -o snapshot.heapsnapshot

场景二:ArkTS 句柄日志分析

# 1. 分析 zip 包,分析并生成html报告
mem-analyzer handle_data.zip

# 2. 分析并生成html报告,显示 Top 20 符号
mem-analyzer tshandle -n 20 handle_data.zip

# 3. 分析并生成html报告,并自动打开结果文件
mem-analyzer -o handle_data.zip

场景三:htrace日志文件分析

# 1. 分析nativeheap, 生成html报告
mem-analyzer leak.htrace

# 2. 分析dma, 生成html报告
mem-analyzer trace -c dma -f html leak.htrace

# 3. 分析nativeheap,且仅显示应用层的Top符号
mem-analyzer trace -s app-only leak.txt

# 4. 分析并生成html报告,并自动打开结果文件
mem-analyzer -o leak.htrace

场景四:提取htrace调用栈数据进行二次分析

# 输出 JSON 格式的原始调用栈数据
mem-analyzer -p data.htrace

# 后处理 out/data/data.json

场景五:资源日志采集并一键分析

# 1. 确认设备已连接
hdc list targets

# 2. 采集目标应用60S的nativeheap堆分配,生成分析报告,并自动打开
mem-analyzer profiler -c nh -t 60 -o com.example.app

# 3. 采集目标应用的堆快照,生成分析报告,并自动打开
mem-analyzer profiler -c snapshot -o com.example.app

macOS运行mem-analyzer

受限于权限管理,在macOS上运行,需授权运行mem-analyzer,或者自行编译运行。

方式1:移除隔离属性

  1. 下载发布的mem-analyzer二进制文件
  2. 解压二进制文件到任意目录,例如 ~/Documents/mem-analyzer/
  3. 打开“终端”,切换到解压目录,移除隔离属性
cd ~/Documents/mem-analyzer/
# 递归移除隔离属性,包括子目录中的文件
xattr -rd com.apple.quarantine ./

方式2:授权运行mem-analyzer

  1. 下载发布的mem-analyzer二进制文件
  2. 解压二进制文件到任意目录,例如 ~/Documents/mem-analyzer/
  3. 打开“终端”,切换到解压目录,运行mem-analyzer
cd ~/Documents/mem-analyzer/
./mem-analyzer
  1. 首次运行时,会弹出如下提示,点击右上的问号,进入手册页面

    首次运行提示
  2. 进入手册页面后,可以看到   “为我打开“隐私与安全性”设置” , 点击此链接,前往系统设置中的“隐私与安全性”设置页面。

    手册页面
  3. 在系统隐私与安全性设置中的“安全性”设置页面下,可看到  已阻止“mem-analyzer”以保护Mac,点击后面的“仍然允许”。

    授权运行
  4. 回到终端,重新运行mem-analyzer,会弹出如下提示,选择“仍要打开”

    仍然允许
  5. 弹出如下提示,授权通过后,即可运行

    重新运行提示
  6. 由于mem-analyzer在运行时,会调用trace_streamer_mac和rawheap_translator,因此同样需要用户进行上诉的授权流程。


注意:针对单个二进制的授权是永久的;但每次重新下载后,运行新下载的二进制都需要重新授权。

方式3:自行编译运行mem-analyzer,无需授权

  1. 下载代码到本地目录,例如 ~/Documents/mem-analyzer/
  2. 进入代码目录,例如 ~/Documents/mem-analyzer/cpp
  3. 使用脚本编译代码,并手动运行mem-analyzer
# 编译代码,编译脚本会校验环境,提示用户下载依赖项
./relase-mac.sh
# 编译完成后,在cpp目录下有`mem-analyzer-x.x.x-macos-xx`目录,进入该目录,运行mem-analyzer
cd mem-analyzer-x.x.x-macos-xx/
./mem-analyzer

相关文档

文档 内容
README.md 项目概述、架构说明、构建指南。(注意版本对应关系)
cpp/README.md C++ 引擎详细文档。(注意版本对应关系)