HarmonyOS Developer DevEco Studio使用指南-应用/服务调试
堆栈可视化调试
堆栈可视化功能可以在调试过程中,将函数之间的调用关系以直观的可视化结构图呈现出来,保留了历史调用关系,克服了跨设备跨语言堆栈列表不连续的弊端。堆栈可视化可使用不同颜色表示不同设备调试的模块,点击调用关系结构图中的函数节点能自动定位到代码中的函数处。使开发者溯源代码更加轻松快捷。
堆栈可视化按如下方式操作。
说明
该功能支持HarmonyOS API Version 4至7的工程,不支持C++工程。
- 在待调试的源代码中打上断点,并启动调试功能。
- 在代码的任意位置单击鼠标右键,在弹出窗口中单击Call Stack。
- 通过调试控制器对代码进行调试,在右侧Call Stack窗口可以查看函数调用关系。
Call Stack窗口显示的函数调用关系:
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页签的调试控制按钮中,操作时光调试相关按钮。
其中,操作按钮说明如下:
跨语言调试
ArkTS/JS与C/C++工程跨语言调试
在C/C++工程中,采用ArkTS/JS与C/C++进行混合开发。一般使用ArkTS或JS进行界面的开发,使用C/C++来开发应用/服务的性能要求较高的部分功能、或Native平台迁移代码。针对这种场景,DevEco Studio提供了ArkTS/JS与C/C++语言的跨语言调试能力,能够在ArkTS或JS调用C/C++方法处,直接进入C/C++代码进行调试。
ArkTS/JS与C/C++跨语言调试功能,包括ArkTS/JS、C/C++断点的管理、调试信息的展示、单步调试等能力,方便开发者快速发现并解决跨语言调用相关代码的问题。
说明
ArkTS/JS与C/C++工程跨语言调试支持API Version 9。
ArkTS/JS与C/C++工程跨语言调试的操作方法如下:
- 将DevEco Studio与设备进行连接。如果使用真机设备,请先对应用/服务进行签名,具体请参考为应用/服务进行签名。
- 在菜单栏单击Run > Edit Configurations,选择OpenHarmony APP下的模块名(如entry),然后在右侧窗口中选择Debugger,将Debug type设置为“Dual(Js + Native)”或“Detect Automatically” 。
- 在ArkTS或JS代码调用C/C++方法代码行处设置断点。
- 单击
按钮或使用快捷键Shift+F9,启动调试。
- 当调试到ArkTS或JS代码调用C/C++方法代码处进行中断。
- 使用Step Into进入到对应的C/C++方法的第一行代码处。然后便可以在C++代码中进行调试,包括:Step Over/Step Into/Step Out/Resume Program。
JS和Java跨语言调试
应用场景概述
针对“JS FA调用Java PA”和“JS FA拉起Java FA”这两种场景,DevEco Studio提供了JS/Java跨语言的调试功能,开发者可以直接从JS代码Step Into进入到Java代码调试中。JS/Java跨语言调试功能包括JS和Java断点的管理、调试信息的展示、单步调试等能力,方便开发者快速发现并解决JS FA调用Java PA相关代码的问题。
JS FA调用Java PA场景
在HarmonyOS应用/服务开发中,通常会涉及到使用JS和Java语言同时开发的场景,一般使用JS来开发应用/服务的UI,使用Java开发应用/服务的逻辑,JS FA调用Java PA,具体请参考JS FA调用Java PA的机制介绍。
说明
暂不支持JS FA异步调用Java PA场景的跨语言调试。
在使用JS/Java跨语言调试设置断点时需注意,JS FA是调用者,Java PA是被调用者,需要在JS FA调用Java PA的代码行或者在Java PA相关接口处设置断点,然后单击Step Into才能在Java或JS实现处中断。
- JS FA端提供了如下接口:
○ FeatureAbility.callAbility(OBJECT):调用PA能力。
○ FeatureAbility.subscribeAbilityEvent(OBJECT, Function):订阅PA能力。如果JS FA调用了订阅接口,则在Java PA的sendRequest方法处设置断点,则可以从Java PA进入到JS FA中。
○ FeatureAbility.unsubscribeAbilityEvent(OBJECT):取消订阅PA能力。
- Java PA端提供了如下接口:
○ boolean IRemoteObject.onRemoteRequest(int code, MessageParcel data, MessageParcel reply, MessageOption option):Ability方式,与FA通过rpc方式通信,该接口主要用于跨设备调用,也支持跨设备分布式应用/服务调试。该方式的优点在于PA可以被不同的FA调用。
○ boolean onRemoteRequest(int code, MessageParcel data, MessageParcel reply, MessageOption option):Internal Ability方式,集成在FA中,适用于与FA业务逻辑关联性强,响应时延要求高的服务。该方式仅支持本FA访问调用。
JS FA拉起Java FA场景
在分布式拉起场景中,允许JS FA拉起一个本地或远程的Java FA,在使用JS/Java跨语言调试设置断点时需注意,JS FA是拉起方,Java FA是被拉起方,需要在JS FA调用Java PA的代码行或者在Java PA相关接口处设置断点,才能正常进入Java断点。
- JS FA端提供了如下接口:
○ FeatureAbility.startAbility(OBJECT):拉起一个远程或本地的FA,无回调结果。
○ FeatureAbility.startAbilityForResult(OBJECT):拉起一个本地的FA,并在回调中等待被拉起FA的结果返回。
- Java FA端提供了onStart(Intent intent) 接口,拉起Java端FA。
操作步骤
JS/Java跨语言调试的操作方法如下:
- 在菜单栏单击Run > Edit Configurations,选择HarmonyOS APP下的模块名(如entry),然后在右侧窗口中选择“Debugger”。
- 检查和设置“Debug type”,请选择Dual(Js+Java)或者Detect Automatically选项。
- 在JS FA调用Java PA处或者在Java PA的相关代码处设置断点。
- 单击
按钮或者快捷键Shift+F9,启动调试。
- 如果在JS FA调用Java PA代码行处设置断点:进入断点后,单击Step Into,快捷键为F7(macOS为F7),进入Java PA函数体,然后进行Java PA的调试。
- 如果在Java PA相关代码行处设置断点:进入断点后,单击Resume Program,快捷键为F9(macOS为Option+Command+R),开始Java PA的调试。
Java和C/C++跨语言调试
在HarmonyOS应用/服务开发中,通常会涉及到使用C/C++和Java语言同时开发的场景,一般使用C/C++来开发应用/服务的性能要求较高的部分功能、或Native平台迁移代码,使用Java开发应用/服务的逻辑。针对这种场景,DevEco Studio提供了C/C++/Java跨语言的调试功能,包括C/C++和Java断点的管理、调试信息的展示、单步调试等能力,方便开发者快速发现并解决Java调用C/C++相关代码的问题。
说明
Java和C/C++跨语言调试,只能使用本地真机设备进行调试,不支持远程真机和远程模拟器进行调试。
Java和C/C++跨语言调试的操作方法如下:
- 在菜单栏单击Run > Edit Configurations,选择HarmonyOS APP下的模块名(如entry),然后在右侧窗口中选择“Debugger”。
- 检查和设置“Debug type”,请选择Dual(Java+Native)或者Detect Automatically选项。
- 在Java代码或C/C++代码处设置断点。
- 单击
按钮或者快捷键Shift+F9,启动调试。
说明
如果直接单击
按钮或者快捷键Shift+F9启动调试,可能应用/服务的启动速度较慢。建议先通过
启动应用/服务,再通过
去attach调试应用/服务。
- 如果在Java代码行处设置断点:进入断点后,可以进行调试单步操作:Step Over/Step Into/Step Out/Resume Program。
- 当代码运行到调用Native方法的代码行时,可以直接Step Into进入到对应的Native方法。
图1 在Java语言中调用C/C++方法处中断
图2 Step Into进入到对应的Native方法
- 如果在C/C++相关代码行处设置断点:进入断点后,可以进行调试单步操作:Step Over/Step Into/Step Out/Resume Program。