OpenHarmony编译开发:hiperf应用优化调试命令行工具实践

news2024/11/25 14:43:47

 简介

hiperf 是 OpenHarmony 为开发人员提供的用于调试的命令行工具,用于抓取特定程序或者系统的性能数据,类似内核的 perf 工具,该工具支持在 Windows/Linux/Mac 等操作系统上运行。

架构

目录

/developtools/hiperf
├── demo			# demo 程序
│   ├── cpp			# C++ demo 程序,示范了如何调用API和模拟的采样场景
│   └── js			# JS demo 程序,示范了如何调用API
├── include			# 工程的头文件
│   └── nonlinux	# 交叉编译的头文件(非linux平台)
├── interfaces		# 接口忘记
│   ├── innerkits	# C++ API 接口
│   └── kits		# JS API 接口
├── proto			# report 命令导出到proto的数据结构定义
├── script			# Host 脚本,包括 HTML
│   └── test		# 脚本的单元测试
├── src				# 源代码文件夹
└── test			# 源代码的单元测试

约束

运行环境条件约束如下

依赖组件版本
Python3.7.0

编译构建

基础配置
  • 确保组件名在于产品形态配置的 json 中
    • 产品形态配置
      • 加入 "developtools:hiperf":{} 即可
编译命令
编译说明编译参数
只编译当前设备平台的二进制执行文件--build-target hiperf_target
编译所有的平台的所有组件(包括单元测试)--build-target hiperf_all
编译目标为 x86_64 Linux 平台的工具--gn-args "hiperf_target_host=true"
编译单元测试--build-target hiperf_unittest
编译单元测试的接口部分(命令行部分)--build-target hiperf_interfacetest
编译输出
编译目标运行平台文件位置文件名
Dev 端命令行程序armout\ohos-arm-release\developtools\hiperf\hiperfhiperf
linuxout\ohos-arm-release\clang_x64\developtools\hiperfhiperf
Host 端命令行程序linuxout\ohos-arm-release\clang_x64\developtools\hiperfhiperf_host
windowsout\ohos-arm-release\mingw_x86_64\developtools\hiperfhiperf_host.exe
Host 端动态库linuxout\ohos-arm-release\clang_x64\developtools\hiperflibhiperf_report.so
windowsout\ohos-arm-release\mingw_x86_64\developtools\hiperflibhiperf_report.dll

也可以在编译完成后

运行 developtools/hiperf/script/package.sh 打包到out文件夹中

host/
└── developtools
    ├── hiperf
    │   ├── bin									# 所有的二进制文件
    │   │   ├── linux							# linux 平台
    │   │   │   └── x86_64
    │   │   │       ├── hiperf_host				# PC运行的执行程序,支持Report和Dump命令
    │   │   │       └── libhiperf_report.so		# PC运行的LIB文件,供python脚本使用
    │   │   ├── ohos
    │   │   │   └── arm							# arm 平台
    │   │   │       └── hiperf					# 板端执行程序
    │   │   └── windows							# windows 平台
    │   │       └── x86_64
    │   │           ├── hiperf_host.exe			# PC运行的执行程序
    │   │           └── libhiperf_report.dll	# PC运行的LIB文件
    │   │
    │   │										# 下面都是python文件,在PC侧执行
    │   ├── command_script.py					# hiperf 命令行的包装脚本,产生采样数据
    │   ├── hiperf_utils.py						# 脚本自己的工具类
    │   ├── loadlib_test.py						# lib 测试脚本
    │   ├── make_diff.py						# 产生Diff数据的脚本
    │   ├── make_report.py						# 从采样数据产生报告的脚本
    │   ├── recv_binary_cache.py				# 收集符号表的脚本
    │   └── report.html							# HTML 展示页面的模板
    └── hiperf.tar.gz							# 上述文件的打包文件
带调试符号的版本
  • 在对应的平台out里面找 exe.unstripped 和 lib.unstripped,例如:

    • out\ohos-arm-release\clang_x64\exe.unstripped\clang_x64\developtools\hiperf

使用说明

测试代码

我们在 hiperf_example_cmd.cpp 里面提供了一些测试代码,

用来验证一些采样功能,比如线程调度,内存申请,CPU 负荷等等。

代码位于

hiperf\demo\cpp\hiperf_example_cmd.cpp

测试命令帮助

./hiperf_example_cmd --help
this is a demo test command
  Use the following commands to simulate different scenarios
  --help
    this page
  --thread <number>
    setup the thread number, default is 5 second
  --time <time>
    setup run sec, default is 10 second
  --stack <level>
    setup stack level, default is 5
  --nowait
    setup skip the start, default wait the start
  --dynamic
    will run some code in each stack level
  --mmap
    will run mmap code in the loop

主要的命令格式

hiperf [options] COMMAND [args for command]
  • [options]
    • 可选的参数
    • 主要是一些调试命令,如打开log等
  • COMMAND
    • 必选参数
    • 子功能的名字,如recrod,report 等等
  • [args for command]
    • 子功能的参数

帮助命令

可以用 --help 查看帮助

--help [command]

[command] --help

以上两种格式都是可以的

主命令参数

参数功能说明
--help [command]显示指定功能的帮助信息
--debug打开 DEBUG 级别的调试日志
--verbose打开 VERBOSE 级别的调试日志
--much打开 MUCH 级别的调试日志
--mixlog混合调试日志输出到屏幕上(stdout)
--logtag <tagA [,tagB] [,tagC]>打开指定模块的MUCH级别的调试日志
--hilog日志打印到Hilog中
--logpath指定日志保存的路径
--nodebug停止打印任何日志

list 命令

列出设备上支持的所有事件名称

事件名称用于 stat 和 record 的 -e 和 -g 参数

Usage: hiperf list [event type name]

下面列出了设备支持的HW事件,并且会提示哪些事件此设备不支持

hiperf list hw

stat 命令

监听指定目标程序,周期性打印性能计数器的值

Usage: hiperf stat [options] [command [command-args]]
       Collect performance counter information of running [command].

下面展示了一个 stats 监听本进程 在 CPU 0 上 3 秒的性能计数器命令

hiperf stat -a -d 3 -c 0

record 命令

采样指定目标程序,并且将采样数据保存到指定的文件中(默认为perf.data)

Usage: hiperf record [options] [command [command-args]]
       Collect performance sampling information of running [command].

对全系统所有进程采样3秒,并且显示详细的信息

hiperf record -d 3 -a --verbose

dump 命令

此命令主要用于以不加以处理的方式直接读取perf.data的数据

开发和测试人员可以核对其中的原始采样数据的正确性。

Usage: hiperf dump [option] \<filename\>
       Dump specific parts of specified file.

report 命令

此命令主要用于展示相关采样数据(从perf.data中读取)

并且转换为用户需要的格式(比如Json或者ProtoBuf)

Usage: hiperf report [option] \<filename\>
       Displays the sampling data.

范例输出普通报告的命令,限制为占比不超过1%

hiperf report --limit-percent 1

脚本

一般用户用脚本执行采样操作(因为可以简单的产生HTML报告)

采样

由 command_script.py 完成,他是 report 命令的包装脚本

usage: command_script.py [-h]
                         (-app PACKAGE_NAME | -lp LOCAL_PROGRAM | -cmd CMD | -p [PID [PID ...]] | -t [TID [TID ...]] | -sw)
                         [-a ABILITY] [-r RECORD_OPTIONS] [-lib LOCAL_LIB_DIR]
                         [-o OUTPUT_PERF_DATA] [--not_hdc_root]

Collect performance sampling information of running [command].

对指定包名采样,包名是 com.ohos.launch

python command_script.py -app com.ohos.launch

对特定进程采样,进程名称是 hdcd

python command_script.py -lp hdcd
收集符号表

由 recv_binary_cache.py 完成,他主要根据 perf.data 里面记录的相关文件和库,以及它们的 buildid 在用户指定的路径中去寻找对应的 ELF 作为符号表文件用于回栈或者打印函数名等。

usage: recv_binary_cache.py [-h] [-i PERF_DATA]
                            [-l LOCAL_LIB_DIR [LOCAL_LIB_DIR ...]]

Recv binaries needed by perf.data from device to binary_cache directory.

指定了2个符号表路径的位置

python recv_binary_cache.py -l Z:\OHOS_MASTER\out\ohos-arm-release\lib.unstripped  Z:\OHOS_MASTER\out\ohos-arm-release\exe.unstripped

对应的符号表文件会复制到 binary_cache 文件夹里面

优先检查用户给出的符号表位置,如果没有则复制设备中的文件

展示

由 make_report.py 完成,将采样后的数据导出为HTML展示页面

usage: make_report.py [-h] [-i PERF_DATA] [-r REPORT_HTML]

To make a report, you need to enter the data source and the path of the
report.

产生HTML文件,默认的文件名是 hiperf_report.html

python make_report.py
  • 展示页面首页

  • 展示页面火焰图

常见故障说明

Can't find hdc_std in PATH environment.
python command_script.py -lp ps
['../..\\..\\platform-tools\\hdc', 'version']
['hdc', 'version']
Traceback (most recent call last):
  File "command_script.py", line 367, in <module>
    main(parser_add_argument())
  File "command_script.py", line 361, in main
    profiler = PerformanceProfile(args)
  File "command_script.py", line 143, in __init__
    self.hdc = HdcInterface(root_authority=not args.not_hdc_root)
  File "Z:\OHOS_MASTER\out\host\developtools\hiperf\hiperf_utils.py", line 173, in __init__
    raise Exception("Can't find hdc in PATH environment.")
Exception: Can't find hdc_std in PATH environment.

请确认 PATH 环境变量中有 hdc 的执行文件

确认方法

where hdc_std
Z:\OHOS_MASTER\developtools\hdc_standard\prebuilt\windows\hdc_std.exe
Z:\OHOS_STD_2.0\developtools\hdc_standard\prebuilt\windows\hdc_std.exe

最后

小编在之前的鸿蒙系统扫盲中,有很多朋友给我留言,不同的角度的问了一些问题,我明显感觉到一点,那就是许多人参与鸿蒙开发,但是又不知道从哪里下手,因为资料太多,太杂,无从选择。有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)文档用来跟着学习是非常有必要的。 

为了确保高效学习,建议规划清晰的学习路线

GitCode - 全球开发者的开源社区,开源代码托管平台希望这一份鸿蒙学习文档能够给大家带来帮助~

 鸿蒙(HarmonyOS NEXT)最新学习路线

该路线图包含基础技能、就业必备技能、多媒体技术、六大电商APP、进阶高级技能、实战就业级设备开发,不仅补充了华为官网未涉及的解决方案

路线图适合人群:

IT开发人员:想要拓展职业边界
零基础小白:鸿蒙爱好者,希望从0到1学习,增加一项技能。
技术提升/进阶跳槽:发展瓶颈期,提升职场竞争力,快速掌握鸿蒙技术

2.学习视频+学习PDF文档

HarmonyOS Next 最新全套视频教程 (鸿蒙语法ArkTS、TypeScript、ArkUI教程……)

纯血版鸿蒙全套学习文档(面试、文档、全套视频等)           

​​​​鸿蒙APP开发必备

总结

【纯血版鸿蒙全套学习文档】

总的来说,华为鸿蒙不再兼容安卓,对程序员来说是一个挑战,也是一个机会。只有积极应对变化,不断学习和提升自己,才能在这个变革的时代中立于不败之地。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2100756.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

单片机-串口通信(二)

目录 一、串口概念 1.相关概念&#xff1a; 按数据传输方式分类&#xff1a; 按时钟分类 二、STM32F103ZET6中串口 USART特性&#xff1a; NRZ数据格式&#xff1a; 三、配置串口通信 查看硬件原理图 软件配置流程 USART相关的寄存器 新建my_usart1.c和my_usart1.h …

Python 中 9 种关键文件类型你了解几个?

当你遇到名称以 .ipynb、.pyi、.pyc 等结尾的 Python 文件时&#xff0c;你是否会感到困惑&#xff1f; 你想知道所有这些文件类型之间的区别吗&#xff1f;今天就和大家一起了解所有这些 Python 文件类型。&#x1f642; .py文件&#xff1a;标准 Python 源代码 不用多说&a…

C++:this指针详解

目录 一、this指针 二、C和C语言实现Stack对比 一、this指针 • Date类中有 Init 与 Print 两个成员函数&#xff0c;函数体中没有关于不同对象的区分&#xff0c;那当d1调用Init和 Print函数时&#xff0c;该函数是如何知道应该访问的是d1对象还是d2对象呢&#xff1f;那么这…

【蔡英丽医生】颈动脉斑块:认识它,预防它,应对它

在我们日常的健康检查中&#xff0c;颈动脉斑块这个词可能会不经意间跃入眼帘&#xff0c;尤其是对于40岁以上的朋友们来说&#xff0c;它的出现率更是居高不下。据调查数据显示&#xff0c;我国40岁以上人群中&#xff0c;颈动脉斑块的检出率超过40%&#xff0c;而60岁以上的人…

【UE5】控件蓝图——树视图(TreeView)的基本使用

目录 前言 效果 步骤 一、显示根节点 二、显示子节点 前言 我们在视口中添加1个方块&#xff0c;2个球体&#xff0c;5个圆柱 它们在大纲视图中的层级关系如下&#xff0c;那么如何将这种层级关系显示在树视图中是本篇文章要解决的问题。 效果 步骤 一、显示根节点 1…

【靶场】Pikachu—XSS Cross-Site Scripting(前五关)

&#x1f3d8;️个人主页&#xff1a; 点燃银河尽头的篝火(●’◡’●) 如果文章有帮到你的话记得点赞&#x1f44d;收藏&#x1f497;支持一下哦 【靶场】Pikachu—XSS Cross-Site Scripting&#xff08;前五关&#xff09; 第一关 反射型xss(get)第二关 反射型xss(post)第三关…

WeSiGJ的系列文章目录

文章目录 Cbasic 面试基础知识系列 23种 设计模式[创建式模式Creative Mode][结构型模式Structural pattern][行为模式Behavioral patterns] 关于作者支持作者 C basic 面试基础知识系列 abstractassertbit_fieldbit_operationCFeaturesconstdecltype 多态double_colon 冒号e…

宝塔官网下载地址

宝塔官网下载地址

启服云专利管理系统 高效管理创新成果

在知识经济时代&#xff0c;专利作为企业的核心竞争力和创新成果的重要载体&#xff0c;其管理效率与保护水平直接关系到企业的市场竞争力与未来发展。启服云管理软件作为一款集智能化、高效化、安全化于一体的为科技服务和知识产权领域设计的SaaS解决方案&#xff0c;旨在帮助…

采购火热!开学返校季这几类产品卖爆了!电商选品指南

9 月开学季&#xff0c;对于学生和家长来说&#xff0c;是一个充满新希望和新开始的时节。对于电商而言&#xff0c;这也是一个重要的销售节点&#xff0c;把握好开学季的需求&#xff0c;进行精准选品&#xff0c;能够带来丰厚的收益。 一、学生文具类 1、 笔记本 无论是传…

zhidianyun01/基于 ThinkPHP+Mysql 灵活用工+灵活用工源码+灵活用工平台源码

‌‌灵活用工‌是一种灵活形式的用工方式&#xff0c;它涵盖了多种形态&#xff0c;包括非全日制用工、‌劳务派遣、‌业务外包等。这种用工方式允许企业在不同需求下灵活地按需聘用人才&#xff0c;而不必建立正式的全职劳动关系。灵活用工的核心在于其灵活性和按需性&#xf…

使用 ELK Stack 进行云原生日志记录和监控:AWS 中的开发运营方法

使用 ELK Stack 进行云原生日志记录和监控 欢迎来到雲闪世界。在当今的云原生世界中&#xff0c;日志记录和监控是强大的 DevOps 策略的重要组成部分。监控应用程序性能、跟踪错误和分析日志对于确保无缝操作和主动识别潜在问题至关重要。在本文中&#xff0c;我们将指导您使用…

搞定——pip 升级失败!pip._vendor.urllib3.exceptions.ReadTimeoutError 这个闹心的问题

pip 升级失败的解决方法 由于网络原因&#xff0c;可能很多小伙伴们都遇到过pip 升级失败的这个问题把&#xff01;提示如下&#xff1a; pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(hostfiles.pythonhosted.org, port443): Read timed out. 怎…

Java学习日记(day26)

一、MVC MVC全名是Model View Controller&#xff0c;是模型(model)&#xff0d;视图(view)&#xff0d;控制器(controller)的缩写&#xff0c;一种软件设计典范&#xff0c; 用一种业务逻辑、数据、界面显示分离的方法组织代码&#xff0c;将业务逻辑聚集到一个部件里面&…

Java基础(8)- Java代码笔记5

目录 一、static关键字 1.概述&#xff1a;静态关键字 2.使用 a.修饰一个成员变量 b.修饰一个方法 3.调用静态成员&#xff1a;类名直接调用&#xff08;不用new对象&#xff09; 4.静态成员特点&#xff1a; 5.static修饰成员的访问特点 6.静态成员在开发中的使用场景…

搭建 canal 监控mysql数据到Elasticsearch(总结)

搭建 canal 监控mysql数据到 elasticsearch 中 需求: 要将 MySQL 数据库 info 中的 notice 和 result 表的增、删、改操作同步到 Elasticsearch 的 notice 和 result 索引&#xff0c;您需要正确配置 MySQL、Canal 、Canal Adapter 、 Elasticsearch 和 kibana 系统rocky9.2…

Django + websocket 连不上

看了网上的几个简单例子&#xff0c;一步一步做&#xff0c;但无一成功。都连不上websocket。 后来按一个视频教程的操作步骤来做&#xff0c;成功了。差别在于视频教程中加了 pip install daphne 和setting.py中 连不上的表现&#xff1a; 前端报错&#xff1a; WebSock…

如何打造在线音乐网站?java springboot架构,vue前端开发,音乐分享新体验

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

基于Prometheus 和K8S kubernetes 构建 搭建监控告警系统

目录 1、Prometheus介绍&#xff1f; 2、Prometheus特点&#xff1f; 2.1 样本 3、Prometheus组件介绍 4、Prometheus工作流程 4、Prometheus和zabbix对比分析 5、Prometheus的几种部署模式 5.1 基本高可用模式 5.2 基本高可用远程存储 5.3 基本HA 远程存储 联邦集群…

【QA】牙科光固化机类产品导光元件在进行检测时应关注哪些问题?

版权说明&#xff1a;本文来源【国家药品监督管理局】&#xff0c;如果您认为我们的文中描述与事实不符或有侵权行为&#xff0c;请及时联系我们。感谢您的关注。