OpenHarmony DevEco Studio使用指南-应用/服务调试
变量可视化调试
在OpenHarmony应用/服务调试过程中,查看变量的变化过程是否符合预期结果是一项常用的调试方法。为此DevEco Studio提供了调试变量的可视化功能,支持c++、JS和ArkTS语言的基本数据类型、数值类型的集合和表达式可视化调试,并以Plain(树形)、Line(折线图) 、Bar(柱状图)和Table(表格)的形式呈现。开发者可以根据这些图形化界面观察当前值、数据类型以及数值的连续变化,通过查看、比对、分析当前变量的变化过程和逻辑关系,判断出当前值(变量)是否符合预期结果,从而迅速有效的定位问题。变量可视化支持当前值可视化和连续变化值可视化两种方式。
当前值可视化
当前值可视化:通过解析Debugger当前帧的信息,获取指定变量当前栈帧中的值,以Plain(树形)、Line(折线图)、Bar(柱状图)和Table(表格)方式进行可视化展示。当前值可视化每次只能观察一个变量,开发者可以根据需要切换变量进行观察。
Plain(树形)显示结果示意图
Line(折线图)显示结果示意图
Bar(柱状图)显示结果示意图
Table(表格)显示结果示意图
支持的数据类型包括基本类型(包括基本数据类型和基本数据类型的包装类)、基本类型的集合和表达式(结果为基本数据类型和基本数据类型的包装类)。其中:
- 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语言的变量可视化为例进行说明。
在连续变化值可视化中,会呈现所有变量的连续变化结果,其中横坐标为断点命中clock,纵坐标为变量值,从添加观察变量的clock开始记录变量值的连续变化。在图中,圆圈符号表示支持(只有数值类型支持)连续变化值可视化,三角符号表示不支持。在图中如果有多个变量的连续变化图,为方便查看其中指定的变量的变化趋势,避免非观察变量带来的影响,开发者可以单击图形上方的变量名,将其设置为灰色,这样就可以在坐标图中隐藏该变量,再次单击灰色的变量名,则在坐标图中呈现出该变量的连续变化值。
说明
横坐标记录范围最大为100,超过100后,则从1开始清除前面的数据。
另外,在连续变化值可视化中,可以单击clock节点,会自动跳转到对应值的代码行(断点位置),并且会高亮显示代码行和clock时钟,如下图所示:
变量可视化操作指导
C++、JS、ArkTS调试变量可视化的操作相同。
- 在待调试的源代码中打上断点,并启动调试功能。
- 打开变量可视化调试窗口,可通过在编辑器或者调试变量栏窗口中,选中变量,单击鼠标右键,选中“Add to Visual Watches”,自动将该变量添加到可视化窗口中。
说明
请注意,变量可视化功能最多同时支持10个变量,如果超过10个变量,请在“Observed Variable”下拉列表中,删除正在显示的变量后添加。
- 查看变量的当前值和连续变化值。
Release应用堆栈解析
应用在Release后,经过代码混淆的堆栈信息无法定位到源码的具体文件和行位置,不易于快速解决问题。针对该场景,DevEco Studio提供了Release应用堆栈解析功能,利用Release应用堆栈中的bundle路径,通过映射规则转换为具体的源码路径,从而提升解决问题的效率。当前仅API Version 8~9支持。
Release应用堆栈解析功能操作方法如下:
- 单击菜单栏Code > Analyze Stack Trace。
- 在弹出的Analyze Stack Trace对话框中,粘贴Release应用的异常堆栈信息,单击OK。
DevEco Studio将解析后的堆栈信息显示在底部的Stacktrace页签中,点击路径链接可快速定位到源码具体位置。
C/C++时光调试
针对C/C++开发场景,DevEco Studio在提供基础调试能力的基础上,同时提供时光调试(历史执行模式)能力,帮助开发者更好地理解代码和更迅速定位问题。
时光调试(历史执行模式)是指在调试过程中可以回退到历史行和历史断点,查看相关变量信息。支持的调试操作为:
- 进入/退出时光调试模式
- 反向Step Over回退到历史行
- 反向Resume执行到历史断点
- 在程序执行历史的记录点上查看全局、静态、局部变量值
前提条件
在File > Settings > Build,Execution,Deployment > Debugger > C++ Debugger设置界面,勾选Enable time travel debug开启C++时光调试开关。
操作步骤
- 设置断点,进入调试模式。
- 在Debug页签的调试控制按钮中,操作时光调试相关按钮。
其中,操作按钮说明如下:
打印日志
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”进行筛选,得到对应的日志信息。
结果输出:
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窗口左侧各个按钮的作用为:
日志打印实例
在按钮中增加一个单击事件,单击按钮时打印一条日志。
说明
本示例采用ArkTS语言为例,使用JS语言开发仅在UI部分代码有所不同,hilog部分代码通用。
- 新建一个工程,选择“Empty Ability”。
- 工程配置界面中,Model选择“FA ”、Language选择“ArkTS”。
- 在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%')
}
}
- 在真机/远程模拟器上运行该工程,单击应用/服务界面上的“Next”按钮。
- 在DevEco Studio的底部,切换到“Log”窗口,设置日志的过滤条件。选择当前的设备及进程,日志级别选择Info,搜索内容设置为“testTag”。此时窗口仅显示符合条件的日志。
打印FaultLog日志
FaultLog是由系统自动从设备进行收集,包括如下四类故障信息:
- App Freeze
- CPP Crash
- JS Crash
- Java Crash
FaultLog故障信息如下图所示,支持按照应用包名进行过滤、日志刷新、日志导出等功能。
如上图所示,FaultLog故障信息左侧按照应用/服务包名 > 故障类型 > 故障时间结构组成,选中具体的故障日期,则会在右侧展示详细的故障信息,便于开发者进行故障定位。