hiprofiler
==========

#### Hiprofiler简介

HiProfiler调优组件旨在为开发者提供一系列调优能力，可以用来帮助分析内存、性能等问题。

整体架构包括PC端和设备端。主体部分是PC端的数据展示页面和设备端的性能调优服务。PC端和设备端服务采用C/S模型，PC端的调优数据在[DevEco Studio](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ide-software-install)和[Smartperf](https://gitcode.com/openharmony/developtools_smartperf_host/releases)网页中展示。设备端程序运行在系统环境中，包含多个部分，其中hiprofilerd进程负责与DevEco通信，作为调优服务。设备端还包括命令行工具hiprofiler\_cmd和数据采集进程hiprofiler\_plugins。调优服务控制数据采集进程获取调优数据，数据最终流向DevEco Studio，整个过程可抽象为生产者-消费者模型。目前已完成多个插件，包括nativehook、CPU、ftrace、GPU、hiperf、xpower和memory数据采集，实现了CPU、GPU、内存和能耗等多维度调优。

Hiprofiler工具对标业界调优工具，并提供更多能力，比如[跨语言回栈、能耗数据获取、长时间堆内存抓栈功能](#插件参数说明)等。

#### 环境要求

*   根据hdc命令行工具指导，完成[环境准备](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/hdc#环境准备)。
    
*   确保设备已正常连接，并执行hdc shell。
    

#### 架构简介

1.  PC端通过DevEco或Smartperf调用hiprofiler\_cmd命令行工具；
    
2.  hiprofiler\_cmd进程启动hiprofilerd调优服务和hiprofiler\_plugins插件进程；
    
3.  hiprofiler\_plugins开启对应插件，将获取到的调优数据汇总至hiprofilerd进程；
    
4.  hiprofilerd进程将调优数据以proto格式存储到文件，或者实时返回给PC端；
    
5.  PC端解析数据，生成泳道，展示获取到的调优数据。
    

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/49/v3/b80cq4LwTza97oespKiEJA/zh-cn_image_0000002625108287.png?HW-CC-KV=V1&HW-CC-Date=20260612T073502Z&HW-CC-Expire=86400&HW-CC-Sign=78974E649AFEAC42F3D281DCFDDA84258B1B72AEB73811B9D2D341684D77E4B3)

#### 命令行说明

使用hiprofiler\_cmd命令行工具可以调用不同插件并输入不同参数，以满足不同的调优需求。示范命令如下：

$ hiprofiler\_cmd \\
  -c - \\
  -o /data/local/tmp/hiprofiler\_data.htrace \\
  -t 30 \\
  -s \\
  -k \\
  --nonblock \\
<<CONFIG
 request\_id: 1
 session\_config {
  buffers {
   pages: 16384
  }
 }
 plugin\_configs {
  plugin\_name: "ftrace-plugin"
  sample\_interval: 1000
  config\_data {
   hitrace\_categories: "binder"
   buffer\_size\_kb: 204800
   flush\_interval\_ms: 1000
   flush\_threshold\_kb: 4096
   trace\_period\_ms: 200
  }
 }
CONFIG

| 命令 | 命令说明 |
| :-- | :-- |
| \-c | 设置该选项后，需要将配置文件放入/data/local/tmp目录下，将路径作为参数输入。 |
| \-o | 自定义文件保存路径（需要以/data/local/tmp开头）。若不设置路径，则调优数据自动保存至/data/local/tmp/hiprofiler\_data.htrace。重复调优会覆盖原来路径的文件。 |
| \-k | 杀掉已存在的调优服务进程。 |
| \-s | 拉起调优服务进程。 |
| \-t | 设置调优持续时间，单位：s。若需手动控制采集时长，请使用start/stop参数组合。 |
| \--nonblock | 
设置hiprofiler\_cmd通过非阻塞的方式运行。

执行命令后，hiprofiler\_cmd转入后台运行，继续执行其他命令。

如果不设置该参数，hiprofiler\_cmd会阻塞执行，直到该命令结束。

**说明**：从API version 23开始支持该参数。

 |
| start | 

设置该选项后，直至输入hiprofiler\_cmd stop命令才会停止调优。通过hiprofiler\_cmd start params执行， 其中params为hiprofiler\_cmd输入的其它参数。不支持同时设置-t参数设置调优时间。具体使用方法参考[常用命令](#常用命令)。

**说明**：从API version 24开始支持该参数。若开启调优后未执行hiprofiler\_cmd stop命令，则调优默认3600秒后结束。

 |
| stop | 

设置该选项后停止通过start命令开启的调优。

**说明**：从API version 24开始支持该参数。start命令与stop命令必须成对调用， 避免重复开启或者重复关闭调优。

 |

输入完hiprofiler\_cmd参数后，需要输入插件配置信息，以<<CONFIG开头，CONFIG结尾。每个插件需要的配置不同，参考[插件参数说明](#插件参数说明)。

以下是session config字段介绍：

| 字段 | 字段说明 |
| :-- | :-- |
| buffers | 共享内存页的数量。 |
| split\_file | 是否拆分文件。true代表拆分文件；false代表不拆分文件。 |
| split\_file\_max\_size\_mb | 设置split\_file为true的情况下，定义每个拆分文件的最大大小。 |

plugin\_configs字段介绍：

| 字段 | 字段说明 |
| :-- | :-- |
| plugin\_name | 开启插件的名字。 |
| sample\_interval | 插件获取调优数据的间隔，单位：ms。 |
| config\_data | 
插件具体参数。每个插件需要的参数不同，参考各插件proto定义。

（代码路径：developtools/profiler/protos）。

 |

生成的trace文件通过hdc file recv命令导到本地，然后上传到smartperf网站或者DevEco Studio进行解析。

#### 支持插件列表

| 插件名字 | 简介 | 规格说明 |
| :-- | :-- | :-- |
| [native hook](#native-hook插件) | 获取堆内存分配的调用栈信息。 | 采集的进程仅支持[使用调试证书签名的应用](#使用调试证书签名的应用)。 |
| [ftrace plugin](#ftrace-plugin插件) | 获取内核打点的trace事件，以及hitrace打点的数据。 | \- |
| [cpu plugin](#cpu-plugin插件) | 获取进程CPU使用率信息，包括进程级和线程级的使用率。 | \- |
| [gpu plugin](#gpu-plugin插件) | 获取进程GPU使用率信息。 | \- |
| [xpower plugin](#xpower-plugin插件) | 获取进程能耗使用情况的数据。 | \- |
| [memory plugin](#memory-plugin插件) | 获取进程内存占用情况，主要是获取进程smaps节点的数据。 | \- |
| [diskio plugin](#diskio-plugin插件) | 获取进程磁盘空间占用情况。 | \- |
| [network profiler](#network-profiler插件) | 通过进程内打点，获取进程HTTP/HTTPS请求的详细信息。 | 采集的进程仅支持[使用调试证书签名的应用](#使用调试证书签名的应用)。 |
| [network plugin](#network-plugin插件) | 获取进程网络流量统计信息。 | \- |
| [hisysevent plugin](#hisysevent-plugin插件) | 通过hisysevent命令，获取hisysevent的事件记录数据。 | \- |
| [hidump plugin](#hidump-plugin插件) | 通过SP\_daemon命令获取相关数据。 | \- |

#### 使用调试证书签名的应用

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/30/v3/hS786F2OQwG2SwaE7wlCjQ/caution_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260612T073502Z&HW-CC-Expire=86400&HW-CC-Sign=3737D3B5E0166AD0CBD3736EEBEB8B587988FE6687E8B0A3CB89FFF7B0ABE594)

确认命令指定的应用是否为可调试应用，可执行hdc shell "bm dump -n bundlename | grep appProvisionType"查询，预期返回信息为"appProvisionType": "debug"。

以包名com.example.myapplication为例，可执行如下命令查询：

hdc shell "bm dump -n com.example.myapplication | grep appProvisionType"

如果包名对应的应用是可调试应用，预期返回信息如下：

"appProvisionType": "debug",

构建可调试应用需要使用调试证书进行签名，申请调试证书及签名可参考：[申请调试证书](https://developer.huawei.com/consumer/cn/doc/app/agc-help-add-debugcert-0000001914263178)。

#### 插件参数说明

#### \[h2\]native hook插件

获取堆内存分配的调用栈信息（通过malloc、mmap、calloc或realloc等基础库函数分配堆内存的调用栈），包括跨语言堆内存分配信息（如在ArkTS语言中调用napi分配native堆内存），还能展示内存泄漏未释放堆内存调用栈信息。

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/bc/v3/e8-x--TfSjWhN0QEI0XikA/caution_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260612T073502Z&HW-CC-Expire=86400&HW-CC-Sign=76DF96D7922EEB14E0140ACBB385EC7EBB4434BCFD7BA1F0202898EA5CDE90FE)

[应用加密](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/code-protect)后只能回native栈，不能回JS栈。

**参数介绍**

| 参数名字 | 类型 | 参数含义 | 详细介绍 |
| :-- | :-- | :-- | :-- |
| fp\_unwind | bool | 
true表示使用fp回栈方式进行回栈；

false表示使用dwarf回栈方式进行回栈。

 | 

fp回栈是利用了x29寄存器保存的fp指针，函数的fp指针始终指向父函数（调用方）的fp指针，调优服务根据这一特点进行回栈，根据ip计算相对PC，然后查找maps对应区间来进行符号化。

由于现在编译期越来越优化，出现寄存器重用或者编译禁用fp，会导致fp方式回不出相应的栈；混合栈情况下，fp不会记录多重混合，于是便需要dwarf回栈方式做更精确的回栈。

dwarf回栈是根据pc寄存器在map表中查找对应的map信息，由于dwarf是逐级解析调用栈，所以其性能会比fp有劣化。

注意：fp回栈暂不支持调优非aarch64架构的设备。

 |
| statistics\_interval | int | 统计间隔，表示将一个统计周期内的栈进行汇总，单位：s。 | 为实现长时间轻量化采集，提供统计模式抓栈。如果更关注调优时的性能，只需要知道每个调用栈出现的次数和总大小，不需要知道每一次具体时间，可以使用统计模式。 |
| process\_name | string | 需要进行内存调优的进程名 | 和/proc/节点下的进程名一致。 |
| startup\_mode | bool | 是否抓取进程启动阶段内存。默认不抓取启动阶段内存。 | 记录进程孵化启动到调优结束这个期间内堆内存分配的信息。 |
| js\_stack\_report | int | 

是否开启跨语言回栈。

0：不抓取js栈。

1：开启抓取js栈。

 | 为方舟环境提供跨语言回栈功能。 |
| malloc\_free\_matching\_interval | int | 匹配间隔，单位：s，指在相应时间间隔内，将malloc和free进行匹配。匹配到的就不进行落盘。 | 在匹配间隔内，分配并释放了的调用栈不被记录，减少了抓栈服务进程的开销。此参数设置的值大于0时，需同步将statistics\_interval参数设置为0。 |
| offline\_symbolization | bool | 

是否开启离线符号化。

true：使用离线符号化。

false：使用在线符号化。

 | 使用离线符号化时，根据IP匹配符号的操作在网页端（smartperf）完成，优化了native daemon的性能，减少了调优时的进程卡顿。但离线符号化会将符号表写入trace文件，导致文件大小比在线符号化时更大。 |
| sample\_interval | int | 采样大小。 | 设置此参数时开启采样模式。采样模式下对于malloc size小于采样大小进行概率性统计。调用栈分配内存大小越大，出现次数越高，被统计的几率越大。 |
| restrace\_tag | string | 需要抓取资源的类型 | 参数可多次添加不同类型。当前支持类型见表[restrace\_tag参数介绍](#restrace_tag参数介绍)。 |
| use\_file\_cache\_mode | bool | 

是否使用文件缓存模式。

true：使用文件缓存模式。

false：不使用文件缓存模式。

默认为false。

 | 

文件缓存模式通过将缓存数据落盘，提升内存分配信息的采集性能，有效缓解应用进程在内存信息采集过程中可能出现的卡顿问题。

**说明**：从API version 24开始，支持该参数。

 |
| async\_stack\_enable | bool | 

是否抓取异步栈。

true：表示开启抓取异步栈功能。

false：表示关闭抓取异步栈功能。

 | 

默认为false。

**说明**：从API version 24开始，支持该参数。

 |
| async\_type | AsyncFlagType | 当前系统支持的异步栈类型。 | 

async\_stack\_enable为true时，该参数才有效。

默认抓取所有的异步栈。当前支持的类型见表[async\_type参数介绍](#async_type参数介绍)。

**说明**：从API version 24开始，支持该参数。

 |

#### \[h2\]restrace\_tag参数介绍

| 参数名称 | 资源类型 | 开始支持的版本 |
| :-- | :-- | :-- |
| RES\_GPU\_VK | vulkan类型的GPU内存分配栈。 | 21 |
| RES\_GPU\_GLES\_BUFFER | OpenGLES的buffer类型GPU内存分配栈。 | 21 |
| RES\_GPU\_GLES\_IMAGE | OpenGLES的image类型GPU内存分配栈。 | 21 |
| RES\_GPU\_CL\_BUFFER | OpenCL类型的buffer类型GPU内存分配栈。 | 21 |
| RES\_GPU\_CL\_IMAGE | OpenCL类型的image类型GPU内存分配栈。 | 21 |
| RES\_FD\_OPEN | 调用open时的句柄函数调用栈。 | 23 |
| RES\_FD\_EPOLL | 调用epoll时的句柄函数调用栈。 | 23 |
| RES\_FD\_EVENTFD | 调用eventfd时的句柄函数调用栈。 | 23 |
| RES\_FD\_SOCKET | 调用socket/socketpair时的句柄函数调用栈。 | 23 |
| RES\_FD\_PIPE | 调用pipe时的句柄函数调用栈。 | 23 |
| RES\_FD\_DUP | 调用dup时的句柄函数调用栈。 | 23 |
| RES\_FD\_ALL | 以上所有fd相关函数调用时的句柄函数调用栈。 | 23 |
| RES\_THREAD\_PTHREAD | 线程创建时的调用栈。 | 23 |
| RES\_THREAD\_ALL | 以上线程相关操作时的调用栈。 | 23 |
| RES\_ARKTS\_HEAP\_MASK | arkts内存分配栈。 | 23 |
| RES\_JS\_HEAP\_MASK | 龙雀虚拟机JSVM内存跟踪 | 23 |
| RES\_SO\_MASK | SO内存分配栈。 | 23 |
| RES\_ASHMEM\_MASK | ashmem内存分配栈。 | 23 |
| RES\_DMABUF\_MASK | dmabuf内存分配栈。 | 23 |
| RES\_ARK\_GLOBAL\_HANDLE | ark全局句柄分配栈。 | 23 |
| RES\_VMA\_ARKWEB | ArkWeb PA分配器内存跟踪。 | 23 |
| RES\_ARK\_LOCAL\_HANDLE | ark本地句柄分配栈。 | 23 |

#### \[h2\]async\_type参数介绍

| 参数名称 | 参数说明 | 开始支持的版本 |
| :-- | :-- | :-- |
| LIBUV\_SEND | 通过三方库libuv接口调用产生的异步栈。 | 24 |
| FFRT\_POOL | 通过FFRT内置线程池产生的异步栈。 | 24 |
| FFRT\_QUEUE | 通过FFRT内置队列产生的异步栈。 | 24 |
| EVENTHANDLER | 通过HarmonyOS Event Handler产生的异步栈。 | 24 |
| PROMISE | JS Promise机制产生的异步栈。 | 24 |
| ARKTS\_WORKER | 通过ArkTS Worker线程产生的异步栈。 | 24 |
| ARKTS\_TASKPOOL | 通过ArkTS线程池产生的异步栈。 | 24 |

**结果分析**

开启fp回栈+跨语言回栈（其中绿色部分为js栈）：

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/ca/v3/rVCpcf59QTiDOmgSdVuOcA/zh-cn_image_0000002594668770.png?HW-CC-KV=V1&HW-CC-Date=20260612T073502Z&HW-CC-Expire=86400&HW-CC-Sign=7C59520448FA1A028E36A72E50BE0893328C9842B4CD5FC8314E1B919DF385BE)

开启dwarf回栈和跨语言回栈（可以展示出native -> js ->native的栈）：

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/ee/v3/hfUxISJMSuWhqhzWxcoQkw/zh-cn_image_0000002594828698.png?HW-CC-KV=V1&HW-CC-Date=20260612T073502Z&HW-CC-Expire=86400&HW-CC-Sign=73B01B237AF32514084FB863A27C4FA0348F379647A61C65B302C15C3D68ADD4)

开启统计模式，在此模式下，栈数据会周期性展示：

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/51/v3/GjkMJbO5S4C_QIqro1-F4Q/zh-cn_image_0000002625188145.png?HW-CC-KV=V1&HW-CC-Date=20260612T073502Z&HW-CC-Expire=86400&HW-CC-Sign=88B47C9C9A5968B4D9D79C5207781F3708B0BF70982786B65B0B8A0C0763AF29)

开启非统计模式，在此模式下，栈数据不会周期性展示：

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/29/v3/aH0asOAyTwKL5IZXeqy_rg/zh-cn_image_0000002625108289.png?HW-CC-KV=V1&HW-CC-Date=20260612T073502Z&HW-CC-Expire=86400&HW-CC-Sign=F4B7988411853E278952C11848080A5A160E512E1CA8294031DA555CB956F8DE)

#### \[h2\]ftrace plugin插件

**参数介绍**

| 参数名字 | 类型 | 参数含义 | 详细介绍 |
| :-- | :-- | :-- | :-- |
| ftrace\_events | string | 抓取的trace event。 | 记录内核打点的trace event。 |
| hitrace\_categories | string | 抓取的hitrace打点信息。 | 调用hitrace能力，获取数据以proto格式写入文件。 |
| hitrace\_apps | string | 抓取的hitrace信息的进程。 | 设置此参数时，只有对应进程的trace信息会被记录。添加此参数时， hitrace\_categories不支持添加binder，否则会导致trace数据解析异常。 |
| buffer\_size\_kb | int | buffer缓存大小，单位：kB。 | hiprofiler\_plugins进程读取内核事件所需要的缓存大小。推荐使用默认数值：204800。 |
| flush\_interval\_ms | int | 采集数据频率，单位：ms。 | 推荐使用默认数值：1000。 |
| flush\_threshold\_kb | int | 刷新数据大小。 | 超过threshold刷新一次数据至文件。用smartperf默认数值即可。 |
| parse\_ksyms | bool | 是否获取内核数据。 | true：获取内核数据；false：不获取内核数据。 |
| trace\_period\_ms | int | 读取内核数据的频率。 | 用smartperf默认数值即可。 |

**结果分析**

示例命令：

$ hiprofiler\_cmd \\
  -c - \\
  -o /data/local/tmp/hiprofiler\_data.htrace \\
  -t 10 \\
  -s \\
  -k \\
<<CONFIG
request\_id: 1
session\_config {
  buffers {
  pages: 16384
  }
}
plugin\_configs {
  plugin\_name: "ftrace-plugin"
  sample\_interval: 1000
  config\_data {
  ftrace\_events: "binder/binder\_transaction"
  ftrace\_events: "binder/binder\_transaction\_received"
  buffer\_size\_kb: 204800
  flush\_interval\_ms: 1000
  flush\_threshold\_kb: 4096
  parse\_ksyms: true
  clock: "boot"
  trace\_period\_ms: 200
  debug\_on: false
  }
}
CONFIG

此命令读取的内核binder\_transaction和binder\_transaction\_received数据，这两个字段同时使用，才能完整展示binder两端数据。执行命令后，通过hdc file recv /data/local/tmp/hiprofiler\_data.htrace命令将文件导出到当前目录，然后用smartperf将该文件打开并解析。结果示例如下图：

点击binder transaction右边的箭头，可以跳转到binder对端的进程或线程。

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/cf/v3/dlzJQEBwRTudRiLjEECeQw/zh-cn_image_0000002594668772.png?HW-CC-KV=V1&HW-CC-Date=20260612T073502Z&HW-CC-Expire=86400&HW-CC-Sign=617F77A99BB20BCD202EFDEDD3EC934613CE8884CD9A7DE06935544E0716C798)

#### \[h2\]memory plugin插件

**参数介绍**

| 参数名字 | 类型 | 参数含义 | 详细介绍 |
| :-- | :-- | :-- | :-- |
| report\_sysmem\_vmem\_info | bool | 是否读取虚拟内存数据。 | 从/proc/vmstat节点读取内存数据。 |
| report\_process\_mem\_info | bool | 是否获取进程详细内存数据，如rss\_shmem，rss\_file，vm\_swap等。 | 从/proc/${pid}/stat节点读取内存数据。 |
| report\_smaps\_mem\_info | bool | 是否获取进程smaps内存信息。 | 从/proc/${pid}/smaps节点获取进程smaps内存数据。 |
| report\_gpu\_mem\_info | bool | 是否获取进程GPU使用情况。 | 读取/proc/gpu\_memory节点数据。 |
| parse\_smaps\_rollup | bool | 是否从smaps\_rollup节点读取smaps统计数据。 | 读取/proc/{pid}/smaps\_rollup节点的smaps统计数据，相比使用report\_smaps\_mem\_info参数调优服务性能会更好（如CPU，内存使用优化）。 |

内存信息包含如下：

*   MemTotal：总内存大小。
*   MemFree：空闲内存大小。
*   Buffers：文件的缓冲大小。
*   Cached：缓存的大小。
*   Shmem：已被分配的共享内存大小。
*   Slab：内核数据缓存大小。
*   SUnreclaim：不可回收的Slab大小。
*   SwapTotal：交换空间的总大小。
*   SwapFree：未被使用交换空间的大小。
*   Mapped：设备和文件等映射的大小。
*   VmallocUsed：已被使用的虚拟内存大小。
*   PageTables：管理内存分页的索引表大小。
*   KernelStack：Kernel消耗的内存。
*   Active： 在经常使用中的缓冲或高速缓冲存储器页面文件的大小。
*   Inactive：在不经常使用中的缓冲或高速缓冲存储器页面文件的大小。
*   Unevictable：不能被释放的内存页。
*   VmallocTotal：vmalloc虚拟内存总大小。
*   CmaTotal：总的连续可用内存。
*   CmaFree：空闲的可用内存。
*   Zram：Zram的使用大小。
*   ZramTotal：Zram的总大小。

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/97/v3/HGlXrjw9RdOdZw3jnKkqMA/caution_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260612T073502Z&HW-CC-Expire=86400&HW-CC-Sign=A3F606DFDBDDAD263CBCEF8C9F2CD11DD52BCA941D797DA47314284518C26EA5)

Active和Inactive的区别在于内存空间中是否包含最近被使用过的数据。当物理内存不足，需要释放正在使用的内存空间时，会优先释放Inactive的内存空间。

**结果分析**

通过hiprofiler\_cmd 命令获取memory数据。

示例命令：

$ hiprofiler\_cmd \\
  -c - \\
  -o /data/local/tmp/hiprofiler\_data.htrace \\
  -t 30 \\
  -s \\
  -k \\
<<CONFIG
request\_id: 1
session\_config {
  buffers {
  pages: 16384
  }
}
plugin\_configs {
  plugin\_name: "memory-plugin"
  sample\_interval: 5000
  config\_data {
  report\_process\_tree: true
  report\_sysmem\_mem\_info: true
  sys\_meminfo\_counters: PMEM\_MEM\_TOTAL
  sys\_meminfo\_counters: PMEM\_MEM\_FREE
  sys\_meminfo\_counters: PMEM\_BUFFERS
  sys\_meminfo\_counters: PMEM\_CACHED
  sys\_meminfo\_counters: PMEM\_SHMEM
  sys\_meminfo\_counters: PMEM\_SLAB
  sys\_meminfo\_counters: PMEM\_SWAP\_TOTAL
  sys\_meminfo\_counters: PMEM\_SWAP\_FREE
  sys\_meminfo\_counters: PMEM\_MAPPED
  sys\_meminfo\_counters: PMEM\_VMALLOC\_USED
  sys\_meminfo\_counters: PMEM\_PAGE\_TABLES
  sys\_meminfo\_counters: PMEM\_KERNEL\_STACK
  sys\_meminfo\_counters: PMEM\_ACTIVE
  sys\_meminfo\_counters: PMEM\_INACTIVE
  sys\_meminfo\_counters: PMEM\_UNEVICTABLE
  sys\_meminfo\_counters: PMEM\_VMALLOC\_TOTAL
  sys\_meminfo\_counters: PMEM\_SLAB\_UNRECLAIMABLE
  sys\_meminfo\_counters: PMEM\_CMA\_TOTAL
  sys\_meminfo\_counters: PMEM\_CMA\_FREE
  sys\_meminfo\_counters: PMEM\_KERNEL\_RECLAIMABLE
  sys\_meminfo\_counters: PMEM\_ACTIVE\_PURG
  sys\_meminfo\_counters: PMEM\_INACTIVE\_PURG
  sys\_meminfo\_counters: PMEM\_PINED\_PURG
  report\_sysmem\_vmem\_info: true
  report\_process\_mem\_info: true
  report\_app\_mem\_info: false
  report\_app\_mem\_by\_memory\_service: false
  report\_purgeable\_ashmem\_info: true
  report\_dma\_mem\_info: true
  report\_gpu\_mem\_info: true
  }
}
CONFIG

此命令读取系统的内存的基本统计信息。执行命令后，通过hdc file recv /data/local/tmp/hiprofiler\_data.htrace命令将文件导出到当前目录，然后通过smartperf打开并解析。结果示例如下图：

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/95/v3/etJ5F27MS0-jgwZrcCrTlA/zh-cn_image_0000002594828700.png?HW-CC-KV=V1&HW-CC-Date=20260612T073502Z&HW-CC-Expire=86400&HW-CC-Sign=85AD1293D6D4B14D9220BA52C0CF734DB813A3356919E94F561C85ACEC4314CE)

通过DevEco Studio 的工具获得内存的数据：

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/6d/v3/0wzbiENdRBedgmIxPrCiWw/zh-cn_image_0000002625188147.png?HW-CC-KV=V1&HW-CC-Date=20260612T073502Z&HW-CC-Expire=86400&HW-CC-Sign=12D533B4EBF1C5A5ACC749E7357D83D797114E28089FA52A87BC557B4F140C5D)

通过DevEco->profiler->Allocation工具，选择Memory泳道，可以使用profiler的memory plugin功能。上图展示了框选时间段的进程smaps内存信息。

#### \[h2\]xpower plugin插件

**参数介绍**

| 参数名字 | 类型 | 参数含义 | 详细介绍 |
| :-- | :-- | :-- | :-- |
| bundle\_name | string | 需要进行能耗调优的进程名。 | 和/proc/节点下的进程名一致。 |
| message\_type | XpowerMessageType | 需要获取能耗数据的类型。 | 数据类型包括：REAL\_BATTERY、APP\_STATISTIC、APP\_DETAIL、COMPONENT\_TOP、ABNORMAL\_EVENTS和THERMAL\_REPORT。 |

**结果分析**

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/49/v3/uT-YxRh3QraXrNfyqoHchA/zh-cn_image_0000002625108291.png?HW-CC-KV=V1&HW-CC-Date=20260612T073502Z&HW-CC-Expire=86400&HW-CC-Sign=7CDAFC86E82CDCC40BCF89BE7817FD4A188A29DE866E424E6E6AE311AC533085)

通过DevEco->profiler->real time monitor工具，可以获取相关进程能耗数据。

#### \[h2\]GPU plugin插件

获取GPU使用率相关信息的数据。

**参数介绍**

| 参数名字 | 类型 | 参数含义 | 详细介绍 |
| :-- | :-- | :-- | :-- |
| pid | int | 需要进行调优的进程ID，与/proc/节点下的进程ID一致。 | \- |
| report\_gpu\_info | bool | 是否展示指定进程的GPU使用率信息。 | true: 展示指定进程的GPU数据，需要设置pid。false: 不展示指定进程的GPU数据。 |

#### \[h2\]CPU plugin插件

获取CPU使用率的相关信息。

**参数介绍**

| 参数名字 | 类型 | 参数含义 | 详细介绍 |
| :-- | :-- | :-- | :-- |
| pid | int | 需要进行调优的进程ID。 | 和/proc/节点下的进程ID一致。 |
| report\_process\_info | bool | 是否展示指定进程的CPU使用率信息。 | 
true：展示指定进程的数据，需要设置pid参数；

false：不展示指定进程的数据，仅展示系统级CPU使用率数据。

 |
| skip\_thread\_cpu\_info | bool | 是否跳过线程CPU使用率数据。 | 

true：不展示每个线程CPU使用率的信息，开启此参数时可以降低调优服务的开销；

false：展示每个线程CPU使用率的信息。

 |

CPU 基本信息包含如下：

*   Start Time：采集时间的时间戳。
*   Duration：前一次采集到本次采集的时间差。
*   TotalLoad%：总的CPU使用率。
*   UserLoad%：CPU在用户态空间运行的使用率。
*   SystemLoad%：CPU在内核空间运行的使用率。
*   Process：进程号。

**结果分析**

示例命令：

$ hiprofiler\_cmd \\
  -c - \\
  -o /data/local/tmp/hiprofiler\_data.htrace \\
  -t 30 \\
  -s \\
  -k \\
<<CONFIG
request\_id: 1
session\_config {
  buffers {
  pages: 16384
  }
}
plugin\_configs {
  plugin\_name: "cpu-plugin"
  sample\_interval: 1000
  config\_data {
  report\_process\_info: true
  }
}
CONFIG

此命令读取cpu的基本统计信息。执行命令后，通过hdc file recv /data/local/tmp/hiprofiler\_data.htrace命令将文件导出到当前目录，然后通过smartperf打开并解析。结果示例如下图：

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/8c/v3/NQzIPkW4R3ClXfiQeTC3dg/zh-cn_image_0000002594668774.png?HW-CC-KV=V1&HW-CC-Date=20260612T073502Z&HW-CC-Expire=86400&HW-CC-Sign=4B12A8A5C025617752FB2A349E0FF87A350FCA427EAD4D9ADB40FA19C4A95CC5)

#### \[h2\]diskio plugin插件

获取整机磁盘I/O使用率的相关信息。

**参数介绍**

| 参数名字 | 类型 | 参数含义 | 详细介绍 |
| :-- | :-- | :-- | :-- |
| report\_io\_stats | IoReportType | 磁盘I/O统计类型。 | 该类型为枚举类型，目前支持：IO\_REPORT。 |

当设置成IO\_REPORT时，会获得如下磁盘IO信息：

*   Data Read：从磁盘读取到内存的总字节数。
*   Data Read/sec：每秒从磁盘读取到内存的字节数。
*   Data Write：从内存写入磁盘的总字节数。
*   Data Write/sec：每秒从内存写入磁盘的字节数。
*   Reads In：读入的字节数。
*   Reads In/sec：每秒读取的字节数。
*   Write Out：写入的字节数。
*   Write Out/sec：每秒写入的字节数。

**结果分析**

示例命令：

$ hiprofiler\_cmd \\
  -c - \\
  -o /data/local/tmp/hiprofiler\_data.htrace \\
  -t 30 \\
  -s \\
  -k \\
<<CONFIG
request\_id: 1
session\_config {
  buffers {
  pages: 16384
  }
}
plugin\_configs {
  plugin\_name: "diskio-plugin"
  sample\_interval: 1000
  config\_data {
  report\_io\_stats: IO\_REPORT
  }
}
CONFIG

此命令读取disk io的基本统计信息。执行命令后，通过hdc file recv /data/local/tmp/hiprofiler\_data.htrace将文件导出到当前目录，然后通过smartperf打开并解析。结果示例如下图：

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/86/v3/nGpjQut5TYeY7h1yKktOPQ/zh-cn_image_0000002594828702.png?HW-CC-KV=V1&HW-CC-Date=20260612T073502Z&HW-CC-Expire=86400&HW-CC-Sign=A2A0883D04EBE6FFD29B55565833698F636D02909D03C55634CA082DB1E50DF3)

#### \[h2\]hidump plugin插件

获取应用进程的fps帧率的数据。

**参数介绍**

| 参数名字 | 类型 | 参数含义 | 详细介绍 |
| :-- | :-- | :-- | :-- |
| report\_fps | bool | 是否报告帧率数据。 | 
true：报告应用进程的帧率数据；

false：不报告帧率数据。

 |
| sections | uint32 | 每1秒上报多少次帧率数据。 | 默认值为10，即每隔100毫秒上报一次帧率数据。 |

**结果分析**

该插件暂时不支持smartperf工具方式的trace数据解析，只支持DevEco Studio模式下的trace数据解析。如下图所示：

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/25/v3/3mtqrOokSSaxgBnz4ud3ZA/zh-cn_image_0000002625188149.png?HW-CC-KV=V1&HW-CC-Date=20260612T073502Z&HW-CC-Expire=86400&HW-CC-Sign=D744AF43BA9BF12F60CFF1B91A008F925F27750DB1EB8A104524B2096E0DACD3)

#### \[h2\]hisysevent plugin插件

获取系统事件记录的数据。

**参数介绍**

| 参数名字 | 类型 | 参数含义 | 详细介绍 |
| :-- | :-- | :-- | :-- |
| msg | string | 自定义的字符串。 | 该字符串作为保留字段，并未实际使用。使用时可传入空字符串 |
| subscribe\_domain | string | 订阅的domain。 | 该字段用来订阅具体的domain下的所有事件。如果为空串，则订阅所有domain下的所有事件。 |
| subscribe\_event | string | 订阅的event。 | 该字段用来订阅具体的event。如果为空串，则订阅所有event。 |

**结果分析**

示例命令：

$ hiprofiler\_cmd \\
  -c - \\
  -o /data/local/tmp/hiprofiler\_data.htrace \\
  -t 30 \\
  -s \\
  -k \\
<<CONFIG
request\_id: 1
session\_config {
  buffers {
  pages: 16384
  }
}
plugin\_configs {
  plugin\_name: "hisysevent-plugin"
  config\_data {
  msg: "hisysevent-plugin"
  subscribe\_domain: ""
  subscribe\_event: ""
  }
}
CONFIG

此命令示例抓取所有hisystem event订阅事件信息。执行命令后，通过hdc file recv /data/local/tmp/hiprofiler\_data.htrace将文件导出到当前目录，然后通过smartperf打开并解析。结果示例如下图：

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/75/v3/gRHp76sRSO6PxyXlldRTrQ/zh-cn_image_0000002625108293.png?HW-CC-KV=V1&HW-CC-Date=20260612T073502Z&HW-CC-Expire=86400&HW-CC-Sign=59DAEC779FB9633786E97E9B6E3A3E032F5038000902D49F3F9FFFFE2CAD17B0)

#### \[h2\]network plugin插件

获取网络上行下载相关的数据。统计网络管理模块提供的网络流量、连接状态等。

**参数介绍**

| 参数名字 | 类型 | 参数含义 | 必选 | 详细介绍 |
| :-- | :-- | :-- | :-- | :-- |
| pid | int32 | 进程ID。 | 否 | 获取指定进程的网络数据。可以传入多个参数。参数缺省时，则抓取整机的网络数据。 |
| startup\_process\_name | string | 启动的进程名。 | 否 | 如果需要抓取指定进程启动的网络数据，则需要指定此参数。 |
| restart\_process\_name | string | 重启的进程名。 | 否 | 如果需要抓取指定进程重启的网络数据，则需要指定此参数。 |

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/89/v3/xQ7OLZL1Rryu_tguDUhk5g/caution_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260612T073502Z&HW-CC-Expire=86400&HW-CC-Sign=2713AAB8E83CA3CC7CD01D25F39DF491C989EC5EBE380F06D5A3141548FB35D5)

startup\_process\_name和restart\_process\_name不能同时为空。

网络信息数据包含如下：

*   StartTime：采集时间的时间戳。
*   Duration：前一次采集到本次采集的时间差。
*   Data Received：接收的网络数据总字节数。
*   Data Received/sec：每秒接收的网络数据字节数。
*   Data Send：发送的网络数据总字节数。
*   Data Send/sec：每秒发送的网络数据字节数。
*   Packets In：接收的网络总数据包数。
*   Packets In/sec：每秒接收的网络数据包数。
*   Packets Out：发送的网络总数据包数。
*   Packets Out/sec：每秒发送的网络数据包数。

**结果分析**

示例命令：

$ hiprofiler\_cmd \\
  -c - \\
  -o /data/local/tmp/hiprofiler\_data.htrace \\
  -t 30 \\
  -s \\
  -k \\
<<CONFIG
request\_id: 1
session\_config {
  buffers {
  pages: 16384
  }
}
plugin\_configs {
  plugin\_name: "network-plugin"
  sample\_interval: 1000
  config\_data {
  }
}
CONFIG

此命令示例抓取整机网络数据信息。执行命令后，通过hdc file recv /data/local/tmp/hiprofiler\_data.htrace将文件导出到当前模板，然后通过smartperf打开并解析。结果示例如下图：

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/61/v3/-GUxB4smTXmovOQ6OpPqew/zh-cn_image_0000002594668776.png?HW-CC-KV=V1&HW-CC-Date=20260612T073502Z&HW-CC-Expire=86400&HW-CC-Sign=0BF3AF5E80FDC1107C4BC4AA6F6A1A9A0DC5167F330284C47DFA142656310D24)

#### \[h2\]network profiler插件

获取进程的网络请求信息，会把每次HTTP请求当作一个数据点记录下来。

**参数介绍**

| 参数名字 | 类型 | 参数含义 | 必选 | 详细介绍 |
| :-- | :-- | :-- | :-- | :-- |
| pid | int32 | 进程ID。 | 否 | 获取指定进程的网络数据。可以传入多个参数。参数缺省时，则抓取整机的网络数据。 |
| startup\_process\_name | string | 启动的进程名。 | 否 | 如果需要抓取指定进程启动的网络数据，则需要指定此参数。 |
| restart\_process\_name | string | 重启的进程名。 | 否 | 如果需要抓取指定进程重启的网络数据，则需要指定此参数。 |
| clock\_id | int | 时间时钟类型 | 是 | 
1：BOOTTIME，系统启动后单调递增时间（含NTP调整）。

2：REALTIME，可调整的系统实时时间。

3：REALTIME\_COARSE，低精度实时时间。

4：MONOTONIC，无NTP调整的单调递增时间。

5：MONOTONIC\_COARSE，低精度单调递增时间。

6：MONOTONIC\_RAW，硬件原始单调递增时间。

 |
| smb\_pages | int | 共享内存页数 | 是 | hiprofiler\_plugins进程和被调优进程建立的共享内存大小，建议值为16384个页大小，即：16384\*4096=67108864字节（64M）。 |
| flush\_interval | int | 磁盘写入间隔 | 否 | 

每flush\_interval次网络请求触发一次磁盘写入，优化IO效率。

默认值为1。

 |
| block | bool | 阻塞模式开关 | 否 | 

true：共享内存满时阻塞采集，可能影响性能。

false：共享内存满时丢弃超出部分的数据。

默认值为false。

 |

**结果分析**

smartperf工具暂时不支持该插件的trace数据解析，若需分析network数据，请使用DevEco Studio的Profiler工具下的NetWork功能。可参考：

[网络诊断：NetWork分析](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ide-profiler-network)

#### 常用命令

#### \[h2\]堆内存分配调用栈数据采样记录

对com.example.insight\_test\_stage进程的堆内存分配操作进行抓栈，并开启fp回栈、离线符号化和统计模式。

$ hiprofiler\_cmd \\
  -c - \\
  -t 30 \\
  -s \\
  -k \\
<<CONFIG
request\_id: 1
session\_config {
  buffers {
  pages: 16384
  }
}
plugin\_configs {
  plugin\_name: "nativehook"
  sample\_interval: 5000
  config\_data {
  save\_file: false
  smb\_pages: 16384
  max\_stack\_depth: 20
  process\_name: "com.example.insight\_test\_stage"
  string\_compressed: true
  fp\_unwind: true
  blocked: true
  callframe\_compress: true
  record\_accurately: true
  offline\_symbolization: true
  startup\_mode: false
  statistics\_interval: 10
  sample\_interval: 256
  js\_stack\_report: 1
  max\_js\_stack\_depth: 10
  }
}
CONFIG

采集的数据会被保存至/data/local/tmp/hiprofiler\_data.htrace文件中，该文件包含了内存泄漏分析所需的函数调用信息、线程和动态库维度内存分配情况，以及调用栈次数和分配大小聚类信息。开启离线符号化，fp回栈，统计模式均可以提升调优服务处理数据速率。

#### \[h2\]抓取指定进程CPU使用率。

对进程号为1234的进程采集CPU数据，采集时长为30s，采样周期为1000ms，调优数据传输的共享内存大小是16384个内存页，采集的数据会被保存至/data/local/tmp/hiprofiler\_data.htrace文件中。

$ hiprofiler\_cmd \\
  -c - \\
  -o /data/local/tmp/hiprofiler\_data.htrace \\
  -t 30 \\
  -s \\
  -k \\
<<CONFIG
 request\_id: 1
 session\_config {
  buffers {
   pages: 16384
  }
 }
 plugin\_configs {
  plugin\_name: "cpu-plugin"
  sample\_interval: 1000
  config\_data {
   pid: 1234
   report\_process\_info: true
  }
 }
CONFIG

#### \[h2\]抓取指定进程GPU图形内存调用栈

抓取指定进程的GPU图形内存调用栈（需要使用最新smartperf release版本解析文件，下载链接：[smartperf](https://gitcode.com/openharmony/developtools_smartperf_host/releases))。

$ hiprofiler\_cmd \\
  -c - \\
  -t 30 \\
  -s \\
  -k \\
<<CONFIG
request\_id: 1
session\_config {
  buffers {
  pages: 16384
  }
}
plugin\_configs {
  plugin\_name: "nativehook"
  sample\_interval: 5000
  config\_data {
  save\_file: false
  smb\_pages: 16384
  max\_stack\_depth: 20
  pid: 11237
  string\_compressed: true
  fp\_unwind: true
  blocked: true
  callframe\_compress: true
  record\_accurately: true
  offline\_symbolization: true
  startup\_mode: false
  statistics\_interval: 10
  malloc\_disable: true
  memtrace\_enable: true
  restrace\_tag: "RES\_GPU\_VK"
  restrace\_tag: "RES\_GPU\_GLES\_BUFFER"
  restrace\_tag: "RES\_GPU\_GLES\_IMAGE"
  restrace\_tag: "RES\_GPU\_CL\_BUFFER"
  js\_stack\_report: 1
  max\_js\_stack\_depth: 10
  }
}
CONFIG

命令中使用了malloc\_disable参数用于过滤nativeheap抓栈的数据；添加的restrace\_tag参数中没有"RES\_GPU\_CL\_IMAGE", 则不抓取OpenCL image类型的GPU内存分配栈。

#### \[h2\]抓取指定进程GlobalHandle对象的调用栈

从API version 23开始支持抓取指定进程创建[napi\_ref](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/use-napi-life-cycle#napi_ref)的调用栈，不会抓取创建弱引用的调用栈。

$ hiprofiler\_cmd \\
  -c - \\
  -t 60 \\
  -o /data/local/tmp/hiprofiler\_data.txt \\
  -s \\
  -k \\
<<CONFIG
request\_id: 1
session\_config {
  buffers {
  pages: 16384
  }
}
plugin\_configs {
  plugin\_name: "nativehook"
  sample\_interval: 5000
  config\_data {
  save\_file: false
  smb\_pages: 16384
  max\_stack\_depth: 20
  pid: 11237
  string\_compressed: true
  fp\_unwind: true
  blocked: true
  callframe\_compress: true
  record\_accurately: true
  offline\_symbolization: true
  startup\_mode: false
  statistics\_interval: 10
  malloc\_disable: true
  memtrace\_enable: true
  restrace\_tag: "RES\_ARK\_GLOBAL\_HANDLE"
  js\_stack\_report: 1
  max\_js\_stack\_depth: 10
  }
}
CONFIG

#### \[h2\]抓取指定进程LocalHandle对象调用栈

从API version 23开始支持LocalHandle对象内存录制功能。例如，可通过如下方式对com.example.insight\_test\_stage进程进行内存录制。

$ hiprofiler\_cmd \\
  -c - \\
  -t 60 \\
  -o /data/local/tmp/hiprofiler\_data.txt \\
  -s \\
  -k \\
<<CONFIG
request\_id: 1
session\_config {
  buffers {
  pages: 16384
  }
}
plugin\_configs {
  plugin\_name: "nativehook"
  sample\_interval: 5000
  config\_data {
  save\_file: false
  smb\_pages: 16384
  max\_stack\_depth: 20
  process\_name: "com.example.insight\_test\_stage"
  string\_compressed: true
  fp\_unwind: true
  blocked: true
  callframe\_compress: true
  record\_accurately: true
  offline\_symbolization: true
  startup\_mode: true
  statistics\_interval: 10
  malloc\_disable: true
  memtrace\_enable: true
  restrace\_tag: "RES\_ARK\_LOCAL\_HANDLE"
  js\_stack\_report: 1
  max\_js\_stack\_depth: 10
  }
}
CONFIG

LocalHandle对象内存录制功能要求被测应用在启动时替换加载维测库，才能正常采集LocalHandle内存信息。

应用替换加载维测库方法：

1.应用处于退出状态：下发LocalHandle对象内存录制命令，设置startup\_mode参数为true，然后启动应用，应用启动后即可进行数据采集。

2.应用处于运行状态：下发LocalHandle对象内存录制命令，设置startup\_mode参数为true，然后重启应用，应用重启后即可进行数据采集。

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/8f/v3/W9poQOZJQmG0mGsFMFLuUA/note_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260612T073502Z&HW-CC-Expire=86400&HW-CC-Sign=55071E6579F47FA75C5DA2CA5CAF5B92D3D21D5EBD5FC2E5AE3513DB07C2B05D)

1.应用加载维测库后，只要应用不退出，维测库持续生效。此后，可以通过非启动模式录制LocalHandle内存，此时startup\_mode参数必须设置为false。

2.使用此种方式后，此次应用打开的时长会变长，此次运行的性能上也会有损失。但不影响下次的使用。

3.此种方式抓取到的LocalHandle内存一定是泄漏的。

4.命令行方式获取的trace文件，可以通过DevEco Profiler[离线导入](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ide-snapshot-basic-operations#section6760173514388)文件功能进行解析。导入的单个文件大小不超过1.5G。

#### \[h2\]手动控制采集时长

使用手动控制采集时长调优启停方式对com.example.insight\_test\_stage进程的堆内存分配操作进行抓栈。

调优开始：

$ hiprofiler\_cmd start \\
  -c - \\
  -s \\
  -k \\
<<CONFIG
request\_id: 1
session\_config {
  buffers {
  pages: 16384
  }
}
plugin\_configs {
  plugin\_name: "nativehook"
  sample\_interval: 5000
  config\_data {
  save\_file: false
  smb\_pages: 16384
  max\_stack\_depth: 20
  process\_name: "com.example.insight\_test\_stage"
  string\_compressed: true
  fp\_unwind: true
  blocked: true
  callframe\_compress: true
  record\_accurately: true
  offline\_symbolization: true
  startup\_mode: false
  statistics\_interval: 10
  sample\_interval: 256
  js\_stack\_report: 1
  max\_js\_stack\_depth: 10
  }
}
CONFIG

调优结束：

$ hiprofiler\_cmd stop

#### 常见问题

#### \[h2\]调优出现异常

**现象描述**

使用hiprofiler\_cmd命令时，显示Service not started。

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/87/v3/DYTHO2BWQfSttKJdNZWMJg/zh-cn_image_0000002594828704.png?HW-CC-KV=V1&HW-CC-Date=20260612T073502Z&HW-CC-Expire=86400&HW-CC-Sign=C242ECCDA28946DD10F96AA5580B52BA5350C74607D841E200291F886CD10135)

**可能原因&解决方法**

调优服务未能开启，说明正在使用DevEco Studio调优或者上次调优异常退出，需要执行hiprofiler\_cmd -k之后再重新执行调优命令。

#### \[h2\]抓取到的trace文件为空

**现象描述**

抓取到的trace文件是空的

**可能原因&解决方法**

需要检查生成文件的路径是否在/data/local/tmp/目录下。如果目标路径是/data/local/tmp下的一个文件夹，则尝试对文件夹执行chmod 777操作。如果是user版本使用nativehook或者network profiler插件抓取的应用不是[使用调试证书签名的应用](#使用调试证书签名的应用)，也抓不到数据。

#### \[h2\]调优数据疑似不准确

**现象描述**

hiprofiler抓取到的native heap和hidumper查看的native heap有差异。

**可能原因&解决方法**

hidumper抓取的是进程维度内存使用情况，hiprofiler抓取到的是进程用户态通过基础库函数（malloc，mmap，realloc等，operator new也是调用的malloc）分配堆内存的数据。两者之间会有差异，差异存在于线程的内存缓存，堆内存延迟释放，加载器使用内存等。

#### \[h2\]调优时目标进程卡顿

**现象描述**

使用hiprofiler\_cmd命令抓取应用进程的内存trace，采用FP回栈或者dwarf回栈时，出现应用进程卡顿。

**可能原因&解决方法**

可以通过hiprofiler\_cmd命令中config参数配置来进行调整。

hiprofiler\_cmd命令中config参数的调整方法如下：

*   适当减小max\_stack\_depth和max\_js\_stack\_depth参数的值，减少回栈深度，减少调用栈信息的采集。
*   适当增大smb\_pages参数的值，增大调优数据传输的共享内存大小。默认值为16384个页大小，即：16384\*4096=67108864字节（64M）。可以调整到128M。
*   适当增加sample\_interval参数的值，增大采样线程栈的大小。默认值为256，可以调整到512。

#### \[h2\]调优时使用FP回栈异常

**现象描述**

使用hiprofiler\_cmd命令抓取应用进程的内存trace，对应的共享库（SO）无法进行基于FP的栈回溯。

**可能原因&解决方法**

检查对应的共享库编译时是否开启了-fomit-frame-pointer编译选项，需保证该选项保持关闭状态。