Native Memory 抓取和展示说明

Native Memory 是查看内存的分配和释放等情况。

Native Memory 的抓取

Native Memory 抓取配置参数

GitHub Logo
配置参数说明:

点击Advance Options进入高级配置界面
GitHub Logo

再点击 Record setting,在 output file path 输入文件名 hiprofiler_data_nativememory.htrace,拖动滚动条设置 buffer size 大小是 64MB,抓取时长是 50s。
GitHub Logo

点击 Trace command,就会根据上面的配置生成抓取命令,点击复制按钮,会将命令行复制。
GitHub Logo

命令行参数说明:

输入 hdc shell,进入设备,执行命令。
GitHub Logo
执行完成后,进入指定目录查看,在/data/local/tmp 下就会生成 trace 文件。
GitHub Logo

Native Memory 展示说明

将抓取的 Native Memory 文件导入到 smartperf 工具中查看,查看内存的分配和释放等情况。

Native Memory 泳道图展示类型

点击齿轮状的图标可以设置内存的展示单位。
GitHub Logo

Native Memory 泳道图的框选功能

可以对内存的数据进行框选,框选后在最下方的弹出层中会展示框选数据的统计表格,总共有五个 tab 页。
Statistics 的 Tab 页,主要显示了统计明细类型。
GitHub Logo

Analysis 的 Tab 页,主要从Memory Type、Thread、Library、Function等维度展示内存统计信息。
GitHub Logo

Call Info 的 Tab 页,主要显示了调用树详细类型。
GitHub Logo

Native Memory 的辅助信息功能

在 Call Info 和 Native Memory 的 Tab 页,点击选中某一行,右边画红线处会显示出该行调用栈的树结构信息。
GitHub Logo

Native Memory 详细显示的过滤功能

点击下方的 All Allocations 可以对 Allocation Lifespan 进行过滤,有三个选择:All Allocations,Created & Existing,Created & Destroyed。
GitHub Logo

Native Memory 的火焰图功能

火焰图的展示跟 Call Info 的 tab 页的调用栈显示一致,鼠标放到色块上,悬浮框可以显示调用栈名称,栈的所在库名,地址, 大小,采集次数。
GitHub Logo

基于函数进行调用栈(单个或多个)选择后可以在时间轴上显示内存操作点

点击火焰图函数时,触发火焰图点击,显示调用栈中该函数出现在时间轴范围的分布情况。
GitHub Logo

内存搜索大小写不敏感,上层火焰图的大小和总内存需要根据搜索内容动态调整

执行搜索的关键字大小写不区分,搜索的函数的 parent 只显示搜索的 children 的大小之和,且可以与点选联动。

焦点函数火焰图详细展开:选中函数的全部调用栈展示

点击调用栈某个函数,点击函数调用的函数对应铺满画布,点击函数的 parent,显示以及绘制的大小变化为点击函数的大小,如下图点击 OHOS::EglCoreInit()函数,会显示该函数的全部调用栈。
GitHub Logo

搜索框支持表达式输入

调用栈默认会显示火焰图,新增搜索框表达式输入。表达式作用范围为 nativehook 的统计与非统计模式。其中处理的为 Responsible Library 与 Responsible Caller,其中 Responsible Library 和Responsible Caller 表示从下往上非 libc++ musl 的第一条调用栈的 lib 跟 symbol,如下图所示,由于最后一条 [ operator new(unsigned long) ] libc++.solibc++.so 的函数,故跳过,所以该条调用栈的 Responsible Library 为 libhilog.so,Responsible Caller 为 OHOS::HiviewDFX::GetDomainLevel(unsigned int) 。
GitHub Logo

表达式说明: 在 InputFilter 输入框可以进行搜索过滤和表达式过滤,其中表达式必须以@开头,英文括号包起所需要过滤的内容,每个括号必须包括 (Responsible Library,Responsible Caller)匹配全量以*表示,否则认为该输入为搜索过滤。

表达式 含义
@(libquickjs tryalloc) 只显示 Responsible Library 为 libquickjs 且 Responsible Caller 包含 tryalloc 的数据
@(libquickjs *) 只显示 Responsible Library 包含 libquickjs 的数据
@(* tryalloc codec bitmapcache skYUV) 只显示 Responsible Library 为任意值 且 Responsible Caller 包含 tryalloc 或 codec 或 bitmapcache 或 skYUV 的数据
@(libglobal *,*resourceManager) 只显示 Responsible Library 包含 libglobal 且 Responsible Caller 为任意值的数据 或 Responsible Library 为任意值,Responsible Caller 包含 resourceManager 的数据
@(/data/user *) 只显示 Responsible Library 路径/data/user 且 symbol 为任意值的数据
@(mali.so *,libGLES_mali.so *) 只显示 Responsible Library 包含 mali.so 或者 libGLES_mali.so 的数据
@(* PixelMap:ReadImageData) 只显示 Responsible Caller 包含 PixelMap:ReadImageData 的数据
@-(libark jsvm table) 不显示 Responsible Library 包含 libark 且 Responsible Caller 包含 jsvm 或者 table 的数据
@-(librender picture, libskia picture)
不显示 Responsible Library 包含 librender 或者 libskia 且 Responsible Caller 中包含 picture 的数据
@-(libark *) 不显示 Responsible Library 包含 libark 的数据
@-(* table) 不显示 Responsible Caller 中 table 的数据
@(_ table) - (libark _) 只显示 Responsible Caller 包含 table 且 Responsible Library 不为 libark 的数据

Native Memory 数据统计功能

选择 Use Record Statistics 和 statistics interval 配置项抓取的数据,只会显示 Call Info 的 Tab 页,Call Info 相关功能同上。
GitHub Logo

Native Memory 多进程数据显示

前端可以支持多进程数据的展示,通过在 tab 页切换不同进程,可以显示不同进程的 hook 数据。
GitHub Logo