Hello HarmonyOS!:鸿蒙应用开发从入门到精通
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.4.7 应用程序的断点调试

在应用开发过程中,难免会遇到各种各样的程序问题,经常需要使用Debug工具来对程序进行调试。在DevEco Studio中,包含了程序的调试能力,使用远程模拟器可以进行多语言和跨语言的调试,同时还支持分布式应用的跨设备调试。

断点调试就是在程序的某一处设置一个断点,当程序运行到此处时会暂时停止,此时,可以通过DevEco Studio提供的工具来对这一时刻的内存变量值和状态进行分析,从而对程序的运行情况进行判断。打断点的方式是在要中断的程序行的行号后点击鼠标左键,如果出现红色圆形标志,就意味着断点已经设置成功,此时整行代码也被标记为红色背景。程序断点如图1-98所示。

图1-98 程序断点

有两种方式可以使断点生效。第一种方式为使用调试模式运行程序。在DevEco Studio窗体的右上角有一个“”按钮,它的作用是将应用部署到设备上,并调试程序,如图1-99所示。

图1-99 Debug模式启动

点击“”按钮,程序便会部署到设备上运行。与直接运行程序不同,用调试模式运行程序后,应用会弹出如图 1-100 所示的窗口,此窗口稍后会自动消失。

稍做等待,程序运行到打断点的地方后,会停止运行,断点由“”变为“”。断点前面的程序的变量值和变量状态可以显式地观察到,如图1-101所示。

图1-100 设备提示进入Debug模式

图1-101 程序进入断点

在DevEco Studio窗体下方会弹出Debug控制台,如图1-102所示,先来看控制台左侧图标的含义。

图1-102 Debug控制台

Resume Program(F9):恢复程序,让程序继续运行。

Pause Program:暂停程序。

Stop'entry'Ctrl+F2:停止程序。

View Breakpoints(Ctrl+Shift+F8):查看所有程序断点。

Mute Breakpoints:使断点失效。

Get Thread Dump:获取线程堆栈信息。

Settings:Debug设置选项。

Pin Tab:固定Tab页签。

在Debug控制台中,还提供了打断点方式运行程序,提供了单步调试、多步调试等功能,控制台中按钮的功能如下:

Show Execution Point(Alt+F10):显示程序断点的位置。

Step Over(F8):单步执行,当遇到子函数时不会进入子函数内,把子函数整体作为单步调试程序时的一步来运行。

Step Into(F7):单步执行,当遇到子函数时进入子函数内,继续单步执行。

Force Step Into(Alt+Shift+F7):单步执行,在调试的时候能进入任何方法。

Step Out(Shift+F8):跳出当前方法。

Drop Frame:回退应用程序的执行,以达到先前的状态。

Run to Cursor(Alt+F9):执行到光标所在的代码行。

Evaluate Expression(Alt+F8):动态执行代码工具。

Trace Current Stream Chain:流式编程调试插件。

在程序运行到断点停止后,在 Debug 控制台的 Variables 窗口中可以看到当前程序的变量值和变量状态。比如,如图1-103所示,当程序运行到断点时,有intent和this两个变量可以查看,变量内包含的信息也可以通过层级展开。intent变量的parameters的值为null,说明intent变量中没有包含其他参数。

图1-103 调试模式下的变量查看

在代码窗口中,将光标指向已经运行过的程序中的变量,也可以看到变量值,我们可以通过排查这些变量值是否和预期的相同来判断程序是否执行正确,如图1-104所示。

第二种方式为通过“”按钮运行程序,然后通过“”按钮来调试已经运行的程序。

首先,将程序运行起来,再点击“”按钮,在弹出的对话框中选择要调试的程序。这时,可以选择要调试的语言,进行多语言调试配置。最后,点击“OK”按钮,便可以对程序进行断点调试了,如图1-105所示。这种方式使开发者不必再重新部署应用,可以在已运行的应用上,直接进行调试。

图1-104 在代码窗口中查看变量值

图1-105 将调试器附加到进程

值得注意的是,如果调试的是Feature模块,那么需要检查Feature模块下的config.json文件的abilities数组是否存在visible属性。如果不存在,那么手动添加 visible 属性且取值为 true,表示该模块可以被其他的应用调用;否则Feature模块的调试无法进入断点。如果不希望该模块被其他应用调用,那么需要在调试完成后删除visible属性。Entry模块的调试则不需要做该检查。