OpenHarmony DevEco Studio使用指南-应用/服务调试

丶龙八夷
发布于 2023-4-4 14:08
浏览
0收藏

变量可视化调试

在OpenHarmony应用/服务调试过程中,查看变量的变化过程是否符合预期结果是一项常用的调试方法。为此DevEco Studio提供了调试变量的可视化功能,支持c++、JS和ArkTS语言的基本数据类型、数值类型的集合和表达式可视化调试,并以Plain(树形)、Line(折线图) 、Bar(柱状图)和Table(表格)的形式呈现。开发者可以根据这些图形化界面观察当前值、数据类型以及数值的连续变化,通过查看、比对、分析当前变量的变化过程和逻辑关系,判断出当前值(变量)是否符合预期结果,从而迅速有效的定位问题。变量可视化支持当前值可视化连续变化值可视化两种方式。

当前值可视化

当前值可视化:通过解析Debugger当前帧的信息,获取指定变量当前栈帧中的值,以Plain(树形)、Line(折线图)、Bar(柱状图)和Table(表格)方式进行可视化展示。当前值可视化每次只能观察一个变量,开发者可以根据需要切换变量进行观察。

Plain(树形)显示结果示意图

OpenHarmony DevEco Studio使用指南-应用/服务调试-鸿蒙开发者社区

Line(折线图)显示结果示意图

OpenHarmony DevEco Studio使用指南-应用/服务调试-鸿蒙开发者社区

Bar(柱状图)显示结果示意图

OpenHarmony DevEco Studio使用指南-应用/服务调试-鸿蒙开发者社区

Table(表格)显示结果示意图

OpenHarmony DevEco Studio使用指南-应用/服务调试-鸿蒙开发者社区

支持的数据类型包括基本类型(包括基本数据类型和基本数据类型的包装类)、基本类型的集合和表达式(结果为基本数据类型和基本数据类型的包装类)。其中:

  • C++支持的呈现形式如下表所示:

数据类型

支持的展示类型

数值类型:int、float、double(或者指定大小的类型如int32_t、int64_t)和signed、unsigned、short、long等的组合

Plain(树形)、Line(折线图)、Bar(柱状图)和Table(表格)

字符类型:char16_t、char32_t、wchar_t等

Plain(树形)和Table(表格)

布尔类型:bool

Plain(树形)和Table(表格)

包含数值类型的集合List、vector、set等

Plain(树形)和Table(表格)

包含数值类型的一维数组

Plain(树形)、Line(折线图)、Bar(柱状图)和Table(表格)

一维对象、键值对map和数值/字符/布尔类型的集合或数组

Plain(树形)和Table(表格)

其它

Plain(树形)

C++可视化功能说明:

    ○  如果观察的变量在当前断点之后,则会提示“Variable not initialized”。

    ○  如果全局静态变量在代码块中未使用,则会提示“error: <user expression 3>:1:1: use of undeclared... ”。

    ○  如果在全局非静态变量和局部变量中存在同名变量名,则在添加C/C++全局非静态变量时,需要以“::变量名”方式添加,才能正常观察其值。

  • JS\ArkTS支持的呈现形式如下表所示:

数据类型

支持的展示类型

数值类型:number

Plain(树形)、Line(折线图)、Bar(柱状图)和Table(表格)

字符类型:string

Plain(树形)和Table(表格)

布尔类型:boolean

Plain(树形)和Table(表格)

一维数值类型的数组:array

Plain(树形)、Line(折线图)、Bar(柱状图)和Table(表格)

一维对象、null和undefined

Plain(树形)和Table(表格)

其它

Plain(树形)

JS\ArkTS语法定义变量不区分数据类型,因此,可视化功能会依据数据结果进行智能识别。例如,array集合识别为数值集合,则支持Plain、Line、Bar和Table;如果识别为字符集合,则只支持Plain和Table。

连续变化值可视化

连续变化值可视化:通过坐标图的方式,可以同时显示多个变量的连续变化过程,以及变量之间的关系。连续变化值可视化,只支持基本数值类型的数据可视化。

下面以ArkTS语言的变量可视化为例进行说明。

OpenHarmony DevEco Studio使用指南-应用/服务调试-鸿蒙开发者社区

在连续变化值可视化中,会呈现所有变量的连续变化结果,其中横坐标为断点命中clock,纵坐标为变量值,从添加观察变量的clock开始记录变量值的连续变化。在图中,圆圈符号表示支持(只有数值类型支持)连续变化值可视化,三角符号表示不支持。在图中如果有多个变量的连续变化图,为方便查看其中指定的变量的变化趋势,避免非观察变量带来的影响,开发者可以单击图形上方的变量名,将其设置为灰色,这样就可以在坐标图中隐藏该变量,再次单击灰色的变量名,则在坐标图中呈现出该变量的连续变化值。

说明

横坐标记录范围最大为100,超过100后,则从1开始清除前面的数据。

OpenHarmony DevEco Studio使用指南-应用/服务调试-鸿蒙开发者社区

另外,在连续变化值可视化中,可以单击clock节点,会自动跳转到对应值的代码行(断点位置),并且会高亮显示代码行和clock时钟,如下图所示:

OpenHarmony DevEco Studio使用指南-应用/服务调试-鸿蒙开发者社区

变量可视化操作指导

C++、JS、ArkTS调试变量可视化的操作相同。

  1. 在待调试的源代码中打上断点,并启动调试功能。
  2. 打开变量可视化调试窗口,可通过在编辑器或者调试变量栏窗口中,选中变量,单击鼠标右键,选中“Add to Visual Watches”,自动将该变量添加到可视化窗口中。

说明

请注意,变量可视化功能最多同时支持10个变量,如果超过10个变量,请在“Observed Variable”下拉列表中,删除正在显示的变量后添加。

  1. 查看变量的当前值和连续变化值。

Release应用堆栈解析

应用在Release后,经过代码混淆的堆栈信息无法定位到源码的具体文件和行位置,不易于快速解决问题。针对该场景,DevEco Studio提供了Release应用堆栈解析功能,利用Release应用堆栈中的bundle路径,通过映射规则转换为具体的源码路径,从而提升解决问题的效率。当前仅API Version 8~9支持。

Release应用堆栈解析功能操作方法如下:

  1. 单击菜单栏Code > Analyze Stack Trace。
  2. 在弹出的Analyze Stack Trace对话框中,粘贴Release应用的异常堆栈信息,单击OK

OpenHarmony DevEco Studio使用指南-应用/服务调试-鸿蒙开发者社区

DevEco Studio将解析后的堆栈信息显示在底部的Stacktrace页签中,点击路径链接可快速定位到源码具体位置。

OpenHarmony DevEco Studio使用指南-应用/服务调试-鸿蒙开发者社区

C/C++时光调试

针对C/C++开发场景,DevEco Studio在提供基础调试能力的基础上,同时提供时光调试(历史执行模式)能力,帮助开发者更好地理解代码和更迅速定位问题。

时光调试(历史执行模式)是指在调试过程中可以回退到历史行和历史断点,查看相关变量信息。支持的调试操作为:

  • 进入/退出时光调试模式
  • 反向Step Over回退到历史行
  • 反向Resume执行到历史断点
  • 在程序执行历史的记录点上查看全局、静态、局部变量值

前提条件

File > Settings > Build,Execution,Deployment > Debugger > C++ Debugger设置界面,勾选Enable time travel debug开启C++时光调试开关。

OpenHarmony DevEco Studio使用指南-应用/服务调试-鸿蒙开发者社区

操作步骤

  1. 设置断点,进入调试模式。
  2. 在Debug页签的调试控制按钮中,操作时光调试相关按钮。

OpenHarmony DevEco Studio使用指南-应用/服务调试-鸿蒙开发者社区

其中,操作按钮说明如下:


OpenHarmony DevEco Studio使用指南-应用/服务调试-鸿蒙开发者社区

打印日志

DevEco Studio的日志系统包括HiLog日志和FaultLog日志系统,其中:

  • HiLog日志系统:让应用/服务可以按照指定类型、指定级别、指定格式字符串打印日志内容,帮助开发者了解应用/服务的运行状态,更好地调试程序。
  • FaultLog日志系统:FaultLog是为了满足OpenHarmony应用/服务开发者基本的故障定位需求而设计,能够帮助应用开发者快速查询、定位、导出应用故障信息。

打印Hilog日志

输出日志

在输出日志前,需要先调用isLoggable确认某个domain、tag和日志级别是否被禁止打印日志。使用示例:

hilog.isLoggable(0x0000, "testTag", hilog.LogLevel.INFO);
  • 参数domain:用于指定输出日志所对应的业务领域,取值范围为0x0~0xFFFFF,开发者可以根据需要进行自定义。
  • 参数tag:用于指定日志标识,可以为任意字符串,建议标识调用所在的类或者业务行为。
  • 参数level:用于指定日志级别。

hilog中定义了DEBUG、INFO、WARN、ERROR、FATAL五种日志级别,并提供了对应的方法用于输出不同级别的日志,如下表所示:

表1 HiLog提供的主要接口

接口名

功能描述

debug(domain: number, tag: string, format: string, ...args: Array<Object>)

输出DEBUG级别的日志。DEBUG级别日志表示仅用于应用/服务调试,默认不输出。

可以在DevEco Studio的terminal窗口或cmd里,通过命令“hdc_std shell hilog -b d”设置可打印日志的等级为DEBUG。

info(domain: number, tag: string, format: string, ...args: Array<Object>)

输出INFO级别的日志。INFO级别日志表示普通的信息。

warn(domain: number, tag: string, format: string, ...args: Array<Object>)

输出WARN级别的日志。WARN级别日志表示存在警告。

error(domain: number, tag: string, format: string, ...args: Array<Object>)

输出ERROR级别的日志。ERROR级别日志表示存在错误。

fatal(domain: number, tag: string, format: string, ...args: Array<Object>)

输出FATAL级别的日志。FATAL级别日志表示出现致命错误、不可恢复错误。

  • 参数domain和tag应与isLoggable中使用的一致。
  • 参数format:格式字符串,用于日志的格式化输出。格式字符串中可以设置多个参数,例如格式字符串为“%s World”,“%s”为参数类型为string的变参标识,具体取值在args中定义。每个参数需添加隐私标识,分为{public}或{private},默认为{private}。{public}表示日志打印结果可见;{private}表示日志打印结果不可见,输出结果为<private>。
    调试时可以通过命令“hilog -p off”指令,关闭隐私开关,明文显示private日志内容。
  • 参数args:可以为0个或多个参数,是格式字符串中参数类型对应的参数列表。参数的数量、类型必须与格式字符串中的标识一一对应。

以输出一条INFO级别的信息为例,示例代码:

hilog.info(0xFF00, "testTag", "%{public}s World %{public}d", "hello", 3);

该行代码表示输出一个普通信息,格式字符串为:”%{public}s World %{public}d”。其中变参"%{public}s"为公共的字符串;%{public}d为公共的整型数。

查看日志信息

DevEco Studio提供了“Log > HiLog”窗口查看日志信息,开发者可通过设置设备、进程、日志级别和搜索关键词来筛选日志信息。搜索功能支持使用正则表达式,开发者可通过搜索自定义的业务领域值和TAG来筛选日志信息。

根据实际情况选择了设备和进程后,搜索标签“testTag”进行筛选,得到对应的日志信息。

OpenHarmony DevEco Studio使用指南-应用/服务调试-鸿蒙开发者社区

结果输出:

12-05 02:37:29.458 17087-17087/com.example.myapplication I A0ff00/testTag: hello World 3
  • 17087-17087表示进程的进程ID和线程ID。
  • com.example.myapplication表示应用进程名。
  • I表示日志级别为INFO。
  • A0ff00中A为日志的bufferID,0ff00为开发者自定义的业务领域ID。
  • testTag为开发者自定义的日志标签。
  • 日志内容中显示将实际取值填入字符串的结果。

HiLog窗口左侧各个按钮的作用为:

OpenHarmony DevEco Studio使用指南-应用/服务调试-鸿蒙开发者社区

日志打印实例

在按钮中增加一个单击事件,单击按钮时打印一条日志。

说明

本示例采用ArkTS语言为例,使用JS语言开发仅在UI部分代码有所不同,hilog部分代码通用。

  1. 新建一个工程,选择“Empty Ability”。
  2. 工程配置界面中,Model选择“FA ”、Language选择“ArkTS”。
  3. Project窗口单击“entry > src > main > ets > MainAbility > pages ”,打开工程中的“index.ets”文件,添加一个按钮,点击按钮打印日志。
    示例代码如下:

// index.ets

import hilog from '@ohos.hilog';

@Entry
@Component
struct Index {
  build() {
    Row() {
      Column() {
        // 添加按钮,以响应用户点击
        Button() {
          Text('Next')
            .fontSize(30)
            .fontWeight(FontWeight.Bold)
        }
        .type(ButtonType.Capsule)
        .margin({
          top: 20
        })
        .backgroundColor('#0D9FFB')
        .width('40%')
        .height('5%')
        // 跳转按钮绑定onClick事件,点击时打印日志
        .onClick(() => {
          hilog.isLoggable(0xFF00, "testTag", hilog.LogLevel.INFO);    
          hilog.info(0xFF00, "testTag", "%{public}s World %d", "hello", 3);
        })
      }
      .width('100%')
    }
    .height('100%')
  }
}
  1. 在真机/远程模拟器上运行该工程,单击应用/服务界面上的“Next”按钮。
  2. 在DevEco Studio的底部,切换到“Log”窗口,设置日志的过滤条件。选择当前的设备及进程,日志级别选择Info,搜索内容设置为“testTag”。此时窗口仅显示符合条件的日志。

OpenHarmony DevEco Studio使用指南-应用/服务调试-鸿蒙开发者社区

打印FaultLog日志

FaultLog是由系统自动从设备进行收集,包括如下四类故障信息:

  • App Freeze
  • CPP Crash
  • JS Crash
  • Java Crash

FaultLog故障信息如下图所示,支持按照应用包名进行过滤、日志刷新、日志导出等功能。

OpenHarmony DevEco Studio使用指南-应用/服务调试-鸿蒙开发者社区

如上图所示,FaultLog故障信息左侧按照应用/服务包名 > 故障类型 > 故障时间结构组成,选中具体的故障日期,则会在右侧展示详细的故障信息,便于开发者进行故障定位。



文章转载自:​​https://developer.harmonyos.com/cn/docs/documentation/doc-guides-V3/ohos-debug-hilog-0000001436399285-V3​

分类
已于2023-4-4 14:08:50修改
收藏
回复
举报
回复
    相关推荐