openharmony 鸿蒙 hitracemeter-view

2025-06-12 浏览 (1)

查看HiTraceMeter日志

通过DevEco Studio可视化界面查看

使用DevEco Studio Profiler的CPU Insight功能,可视化展示HiTraceMeter日志内容,分析应用或服务的CPU使用率和线程运行状态,查看指定时间段内程序在CPU上的执行耗时。具体使用指导请参考CPU活动分析:CPU分析

通过命令行工具查看

  1. 根据hdc命令行工具指导,完成环境准备,确保可以使用 hdc shell 命令正常连接设备。

  2. 在DevEco Studio的Terminal窗口或主机命令行窗口执行 hdc shell 命令连接设备,然后在设备上执行hitrace命令,开启HiTraceMeter日志抓取服务。

    PS D:\xxx\xxx> hdc shell
    $ hitrace --trace_begin app
    
  3. 在设备上运行包含HiTraceMeter打点的相关程序。

  4. 转储HiTraceMeter文本日志,该日志包含步骤3中生成的HiTraceMeter打点信息。

    • 默认将日志打印在窗口中。
    $ hitrace --trace_dump
    
    • 可提供文件名将日志保存至文件中,文件路径只能是 /data/local/tmp/,其他路径无权限。
    $ hitrace --trace_dump -o /data/local/tmp/trace.ftrace
    
  5. 在设备上执行hitrace命令,停止HiTraceMeter日志抓取服务。

    $ hitrace --trace_finish
    
  6. 退出设备,进入主机,导出设备中的HiTraceMeter文本日志到当前目录。

    $ exit
    PS D:\xxx\xxx> hdc file recv /data/local/tmp/trace.ftrace ./
    
  7. 搜索HiTraceMeter文本日志中的打点名称等关键字,查看打点是否成功。

  8. HiTraceMeter支持文本日志的可视化分析。

用户态trace格式说明

开发者可以通过hitrace命令采集用户通过hiTraceMeter接口生成的用户态trace日志,从而对应用进行性能分析。本章节将详细介绍用户态trace的格式和扩展规则,包括同步、异步和整数值跟踪等类型。每种trace的字段组成、含义及与打点入参的关系都会逐一说明,并提供具体样例供参考。

API version 19 及以上版本的用户态trace格式参考当前版本用户态trace格式,API version 19 以下版本的用户态trace格式参考API version 19 前用户态trace格式

当前版本用户态trace格式

同步跟踪

  • 开始trace格式:[类型标识符]|[进程号]|H:[分布式跟踪链路ID]#[内容]|[级别与所属Tag集合]|[自定义键值对]

  • 结束trace格式:[类型标识符]|[进程号]|[级别与所属Tag集合]

一条完整的同步跟踪包括一个开始trace和一个结束trace,开始trace的类型标识符固定为B,结束trace的类型标识符固定为E

异步跟踪

  • 起始trace格式:[类型标识符]|[进程号]|H:[分布式跟踪链路ID]#[内容]|[异步任务ID]|[级别与所属Tag集合]|[自定义聚类名称]|[自定义键值对]

  • 结束trace格式:[类型标识符]|[进程号]|H:[分布式跟踪链路ID]#[内容]|[异步任务ID]|[级别与所属Tag集合]

一条完整的异步跟踪也同样包含一个开始trace和一个结束trace,开始trace的类型标识符固定为S,结束trace的类型标识符固定为F

整数值跟踪

  • trace格式:[类型标识符]|[进程号]|H:[分布式跟踪链路ID]#[内容]|[整数值]|[级别与所属Tag集合]

一条整数值跟踪trace仅包含一条独立trace,其中trace的类型标识符固定为C

注意:

  1. 一条有效且完整的同步跟踪trace与异步跟踪trace,均包含一条起始trace和一条结束trace,开发者需要保证接口调用的匹配性,否则会导致性能跟踪异常问题。具体可参考ArkTS接口:@ohos.hiTraceMeter (性能打点)或C++接口:Hitrace
  2. 用户态trace总长度限制512字符,超过部分将被截断。

字段说明

本小节将详细介绍用户态trace的各个字段,包括字段组成、含义,字段与打点入参之间的关系使用@ohos.hiTraceMeter (性能打点)作为参考。

  • 类型标识符

    类型标识符与调用的@ohos.hiTraceMeter (性能打点)具体接口相关,其映射关系如下:

    • B:开启一个同步时间片跟踪事件。
    • E:结束一个同步时间片跟踪事件。
    • S:开启一个异步时间片跟踪事件。
    • F:结束一个异步时间片跟踪事件。
    • C:整数跟踪事件。
  • 分布式跟踪链路ID

    开启HiTraceChain(分布式跟踪)时,会将HiTraceId核心信息记录在trace打点中,格式为[ChainId,SpanId,ParentSpanId],结尾使用#分隔符与内容字段区分。

    未开启HiTraceChain(分布式跟踪)时,打点不包含该字段。

    • ChainId:HiTraceId的链Id。
    • SpanId:HiTraceId的当前跨度号。
    • ParentSpanId:HiTraceId的父跨度号。

    HiTraceChain具体使用指导请参考使用HiTraceChain打点(ArkTS/JS)使用HiTraceChain打点(C/C++)

  • 内容

    表示打点名称或整数变量名。对应@ohos.hiTraceMeter (性能打点) 接口的name入参。

  • 异步任务ID

    和内容字段合并用于匹配相同的异步跟踪trace的开始与结束打点。对应@ohos.hiTraceMeter (性能打点) 接口的taskId入参。

  • 整数值

    仅在整数值跟踪trace中包含,为跟踪的整数值。对应@ohos.hiTraceMeter (性能打点) 接口的count入参。

  • 级别与所属Tag集合

    本字段由级别和所属Tag集合两部分信息组成。

    通过打点接口传入的级别信息,该部分为以下字符之一:DICM。对应@ohos.hiTraceMeter (性能打点)接口的level入参,详细介绍及映射关系参考HiTraceOutputLevel

    所属Tag集合表示trace打点所属Tag类别,每类用两位数字表示,可包含多个从小到大排列的两位数字。

    例如B|1314|H:TestFunction|I3062,其中I表示该条打点级别为Info3062表示该条打点所属Tag集合,根据Tag名称与值的映射关系,参考 HiTraceMeter Tag可知30对应ohosTag,62对应appTag。

    说明:

    1. 对于API version 19及之后接口,支持自定义输出级别;对于API version 18及之前接口,trace打点默认为COMMERCIAL级别打点。

    2. 系统侧存在一条用户态trace隶属于多个Tag的情况,@ohos.hiTraceMeter (性能打点) ArkTS接口和Hitrace C++接口提供的应用侧用户态trace打点功能无法指定所属Tag集合,对应Tag分类固定为app,字段值为62

  • 自定义聚类名称

    可用于开发者自定义的聚类操作。对应@ohos.hiTraceMeter (性能打点) 接口的customCategory入参。该字段值可能为空,从而使得日志格式发生变化,详见字段为空情况说明

    在trace可视化工具中,同一进程中相同聚类名称的异步打点放在同一泳道上进行展示。

  • 自定义键值对

    格式为key=value,多个键值对使用逗号分隔,例如key1=value1,key2=value2。对应@ohos.hiTraceMeter (性能打点)接口的customArgs入参。该字段值可能为空,从而使得日志格式发生变化,详见字段为空情况说明

    在trace可视化工具中,对满足格式要求的自定义键值对,以键值对形式展示解析结果。

字段扩展规则

API version 19及后续版本的新增字段,均以竖线+字段的方式,追加在当前用户态trace格式的末尾。

各场景trace日志样例

打点类型开启HiTraceChain时格式未开启HiTraceChain时格式
开始同步trace打点B|1234|H:[a92ab94c18e1341,0,0]#tracename|M62|user=root,type=2B|1234|H:tracename|M62|user=root,type=2
结束同步trace打点E|1234|M62E|1234|M62
开始异步trace打点S|1234|H:[a92ab94c18e1341,0,0]#tracename|428|M62|appcategory01|user=root,type=2S|1234|H:tracename|428|M62|appcategory01|user=root,type=2
结束异步trace打点F|1234|H:[a92ab94c18e1341,0,0]#tracename|428|M62F|1234|H:tracename|428|M62
整数trace打点C|1234|H:[a92ab94c18e1341,0,0]#tracename|5678|M62C|1234|H:tracename|5678|M62

上述trace日志样例中,进程号均为1234,打点内容均为tracename,级别均为M,代表COMMERCIAL级别,所属Tag集合均为62,仅包含一个Tag,对应的Tag名称为app。在开启HiTraceChain情况下,分布式跟踪链路ID为[a92ab94c18e1341,0,0]。同步trace与异步trace跟踪的自定义键值对均为user=root,type=2, 其中异步trace打点的异步任务ID为428,自定义聚类名称为appcategory01。整数值跟踪的跟踪值为5678

说明:

用户态trace总长度限制为512字符,建议内容自定义聚类名称自定义键值对参数总长度不超过420字符,避免被截断。

字段为空情况说明

如果用户态trace格式中间字段对应接口参数传入内容为空,用户态trace格式将保留|分隔符,如果尾部字段为空,用户态trace格式将不保留|分隔符。以hiTraceMeter.startAsyncTrace19+hiTraceMeter.startSyncTrace19+接口的自定义聚类名称自定义键值对参数为例,对应的格式参考如下。

  • 开始同步trace打点。

    • 自定义键值对字段不为空字符串。

      B|[进程号]|H:[分布式跟踪链路ID]#[内容]|[级别与所属Tag集合]|[自定义键值对]
      
    • 自定义键值对字段为空字符串。

      B|[进程号]|H:[分布式跟踪链路ID]#[内容]|[级别与所属Tag集合]
      
  • 开始异步trace打点。

    • 自定义聚类名称自定义键值对字段均不为空字符串。

      S|[进程号]|H:[分布式跟踪链路ID]#[内容]|[异步任务ID]|[级别与所属Tag集合]|[自定义聚类名称]|[自定义键值对]
      
    • 自定义聚类名称字段为空字符串,自定义键值对字段不为空字符串。

      S|[进程号]|H:[分布式跟踪链路ID]#[内容]|[异步任务ID]|[级别与所属Tag集合]||[自定义键值对]
      
    • 自定义聚类名称字段不为空字符串,自定义键值对字段为空字符串。

      S|[进程号]|H:[分布式跟踪链路ID]#[内容]|[异步任务ID]|[级别与所属Tag集合]|[自定义聚类名称]
      
    • 自定义聚类名称自定义键值对字段均为空字符串。

      S|[进程号]|H:[分布式跟踪链路ID]#[内容]|[异步任务ID]|[级别与所属Tag集合]
      

HiTraceMeter Tag

以下为 HitraceMeter 用户态Tag集合,其中Tag值为实际代码层面基于数字1的左移值。用户态Tag可通过hitrace -l 命令查看其解释,其中alwayscommercialTag为系统侧为默认常开和商用版本场景定制的Tag。

Tag名称代码层常量值Tag值
always1ULL << 000
commercial1ULL << 505
drm1ULL << 606
security1ULL << 707
animation1ULL << 909
push1ULL << 1010
virse1ULL << 1111
ffrt1ULL << 1313
musl1ULL << 1212
cloud1ULL << 1414
deviceauth1ULL << 1515
commonlibrary1ULL << 1616
hdcd1ULL << 1717
hdf1ULL << 1818
usb1ULL << 1919
interconn1ULL << 2020
dlpcre1ULL << 2121
accesscontrol1ULL << 2222
net1ULL << 2323
nweb1ULL << 2424
huks1ULL << 2525
useriam1ULL << 2626
daudio1ULL << 2727
dlsm1ULL << 2828
filemanagement1ULL << 2929
ohos1ULL << 3030
ability1ULL << 3131
zcamera1ULL << 3232
zmedia1ULL << 3333
zimage1ULL << 3434
zaudio1ULL << 3535
distributeddatamgr1ULL << 3636
mdfs1ULL << 3737
graphic1ULL << 3838
ace1ULL << 3939
notification1ULL << 4040
misc1ULL << 4141
multimodalinput1ULL << 4242
sensors1ULL << 4343
msdp1ULL << 4444
dsoftbus1ULL << 4545
rpc1ULL << 4646
ark1ULL << 4747
window1ULL << 4848
account1ULL << 4949
dscreen1ULL << 5050
dcamera1ULL << 5151
dhfwk1ULL << 5252
gresource1ULL << 5353
devicemanager1ULL << 5454
samgr1ULL << 5555
power1ULL << 5656
dsched1ULL << 5757
deviceprofile1ULL << 5858
dinput1ULL << 5959
bluetooth1ULL << 6060
accessibility1ULL << 6161
app1ULL << 6262

HiTraceOutputLevel

trace输出级别枚举名称(C/C++)trace输出级别枚举名称(ArkTS/JS)枚举值trace级别
HITRACE_LEVEL_DEBUGDEBUG0D
HITRACE_LEVEL_INFOINFO1I
HITRACE_LEVEL_CRITICALCRITICAL2C
HITRACE_LEVEL_COMMERCIALCOMMERCIAL3M

API version 19 前用户态trace格式

同步跟踪

  • 开始trace格式:[类型标识符]|[进程号]|H:[分布式跟踪链路ID]#[内容]

  • 结束trace格式:[类型标识符]|[进程号]

异步跟踪

  • 开始trace格式:[类型标识符]|[进程号]|H:[分布式跟踪链路ID]#[内容] [异步任务ID]

  • 结束trace格式:[类型标识符]|[进程号]|H:[分布式跟踪链路ID]#[内容] [异步任务ID]

整数值跟踪

  • trace格式:[类型标识符]|[进程号]|H:[分布式跟踪链路ID]#[内容] [整数值]

说明:

异步跟踪trace的开始trace格式与结束trace格式一样。需要注意的是 API version 19 以前的版本,异步跟踪trace的异步任务ID字段、整数值跟踪的整数值字段与内容字段使用空格进行分隔。

API version 19 前各场景trace日志样例

打点类型开启HiTraceChain时格式未开启HiTraceChain时格式
开始同步trace打点B|1234|H:[a92ab94c18e1341,0,0]#tracenameB|1234|H:tracename
结束同步trace打点E|1234|E|1234|
开始异步trace打点S|1234|H:[a92ab94c18e1341,0,0]#tracename 428S|1234|H:tracename 428
结束异步trace打点F|1234|H:[a92ab94c18e1341,0,0]#tracename 428F|1234|H:tracename 428
整数值跟踪trace打点C|1234|H:[a92ab94c18e1341,0,0]#tracename 5678C|1234|H:tracename 5678

上述trace日志样例中,进程号为1234,打点内容均为tracename。开启HiTraceChain情况下,分布式跟踪链路ID为[a92ab94c18e1341,0,0]。其中异步trace打点的异步任务ID为428,整数值跟踪的跟踪值为5678

你可能感兴趣的鸿蒙文章

harmony 鸿蒙Performance Analysis Kit(性能分析服务)

harmony 鸿蒙分析AppFreeze(应用无响应)

harmony 鸿蒙应用恢复开发指导

harmony 鸿蒙分析CppCrash(进程崩溃)

harmony 鸿蒙错误管理开发指导

harmony 鸿蒙hdc

harmony 鸿蒙事件上报

harmony 鸿蒙HiAppEvent介绍

harmony 鸿蒙订阅踩内存事件(ArkTS)

harmony 鸿蒙订阅踩内存事件(C/C++)

  • 所属分类: 后端技术
  • 本文标签: 软件 鸿蒙
  • 版权声明: 本文链接 https://seaxiang.com/blog/XGi3BV