在项目的开发过程中和程序的运行过程中,会出现各种各样需要解决的问题,这时候需要调试来排查和定位问题的原因,然后解决问题。
Android Studio允许在模拟器和真机上调试应用程序,我们可以根据需要设置不同类型的断点,也可以查看内存中数据的变化,还可以在运行时添加日志或计算表达式。
调试程序的一般步骤如下。
(1)添加断点。
(2)运行调试。
(3)执行到断点。
(4)显示调试器窗口。
(5)查看调试信息。
(6)使用步进调试工具分析代码。
(7)使用控制调试工具管理断点和程序运行。
1.3.10.1 调试应用程序
下面演示在Android Studio中调试Android应用程序的过程。
(1)定位调试代码。为了演示调试过程,在onCreate()函数中增加三行代码。
(2)设置断点,选定要设置断点的代码行,在行号的区域后面单击鼠标左键即可,如图1-88所示,此处设置3个断点。
图1-88 设置断点
(3)开启调试会话,单击黑色箭头指向的按钮,开始调试,如图1-89所示。
图1-89 启动调试
(4)IDE下方出现Debug视图,在其中显示了当前调试程序停留的代码行,如图1-90所示。
图1-90 调试窗口
(5)在Debug视图中有四个调试执行按钮,如图1-91所示。
图1-91 Debug视图中四个调试执行按钮
Step Over:程序向下执行一行(如果当前行有方法调用,这个方法将被执行完毕返回,然后到下一行)。
Step Into:程序向下执行一行。如果该行有自定义方法,则运行进入自定义方法(不会进入官方类库的方法)。
Force Step Into:该按钮在调试的时候能进入任何方法。
Step Out:如果在调试的时候进入了一个方法,并觉得该方法没有问题,则可以使用StepOut跳出该方法,返回到该方法被调用处的下一行语句。
(6)在Debug视图中,单击StepOver按钮,程序执行下一行,如图1-92所示。
(7)停止调试。单击工具栏中红色方块按钮,即停止调试,如图1-93所示。
图1-92 执行到下一个断点
图1-93 停止调试
1.3.10.2 断点
断点会暂停应用程序的执行,线程被挂起,然后可以通过调试器查看信息。Android Studio中的断点类型有很多,每一种断点都有它适用的场合和特殊的作用。
1.行断点
行断点是最常用的断点类型,用于对代码中特定的行进行调试。设置断点的方法如下。
(1)选中代码行,选择菜单栏中Run>Toggle Line Breakpoint命令。
(2)在行号的区域后面单击鼠标左键。
取消断点的方法和设置断点相同。
右击行断点,弹出属性对话框,在此可进行断点属性设置,如图1-94所示。
图1-94 断点属性对话框
对话框中的选项含义如下。
Enabled:断点禁用和启用。
Suspend:勾选All选项,执行到断点时,所有线程都会被挂起;勾选Thread选项,执行到当前断点,只有当前断点所在的线程挂起。
Condition:设置断点暂停的条件。
2.方法断点
方法断点主要用来检查方法的输入和输出,包括参数和返回值。
设置方法断点的方法如下。
(1)选中方法名行,执行菜单栏中Run>Toggle Method Breakpoint命令。
(2)在方法名的区域后面单击鼠标左键,如图1-95所示。
取消断点的方法与设置断点的方法相同。
右击行断点,弹出属性对话框,如图1-96所示。
图1-95 设置方法断点
图1-96 断点属性对话框
与行断点相比,方法断点的属性多了一个Watch,用来监视方法的进入(Method entry)和退出(Method exit)。
单击调试运行按钮,开始进入调试,运行到方法头停下来,如图1-97所示。
(www.xing528.com)
图1-97 调试方法断点
3.临时断点
若想某个断点只被触发一次后即自动删除,可以使用临时断点。
设置临时断点的方法:选中行,执行菜单栏中Run>Toggle Temporary Breakpoint命令。
右击行断点,弹出属性对话框,如图1-98所示。
如果想把临时断点变为普通断点,在属性中取消勾选Remove once hit复选框即可。
4.异常断点
异常断点会在某个异常发生时触发断点,这样我们就可以在第一时间得到异常信息,便于排查问题。
设置异常断点的方法:执行菜单栏中Run>View Breakpoints命令,弹出的窗口如图1-99所示,选择左上角的+号,选择第3个选项Java Exception Break-points。
图1-98 临时断点属性对话框
图1-99 设置异常断点
弹出的窗口如图1-100所示,在其中选择异常类。
如果要取消断点,则选中左上角的-号。
5.日志断点
在调试的时候,若想临时多加一些日志,但又不想重新构建应用程序,则可以使用日志断点。
断点设置方法:右击断点,取消勾选Suspend复选框,在展开的面板中勾选Evaluate andlog复选框,输入日志表达式,如图1-101所示。
图1-100 选择异常类
图1-101 设置日志断点
1.3.10.3 帧调试窗口
帧调试窗口显示了当前断点所在的线程以及执行到该断点所调用过的方法。
1.堆栈帧
堆栈帧是用来存储数据和部分过程结果的数据结构,同时也被用来处理动态链接(Dy-namic Linking)、方法返回值和异常分派(Dispatch Exception)。堆栈帧随着方法调用而创建,随着方法结束而销毁——无论方法是正常完成还是异常完成(抛出了在方法内未被捕获的异常),都算作方法结束,每一个堆栈帧都有自己的局部变量表、操作数栈和指向当前方法所属的类的运行时常量池的引用。
2.当前堆栈帧
一个线程在执行过程中,执行到断点处暂停时,如果只有当前正在执行的那个方法的堆栈帧是活动的,这个堆栈帧就叫当前堆栈帧。
帧调试窗口如图1-102所示。
图1-102 帧调试窗口
1.3.10.4 监视窗口
监视窗口用来计算当前堆栈帧范围内的变量或表达式,在调试过程中通过监视窗口来监视变量或表达式的值。
1.监视变量
在Variable窗口右击变量,选择Add to Watches命令,右边的监视窗口即会出现变量,如图1-103所示。
图1-103 增加监视变量
2.监视表达式
单击Watches窗口左上角+按钮,输入表达式,如图1-104所示。
1.3.10.5 变量调试窗口
可以在变量窗口中检查应用程序中对象的值。当选择堆栈帧的时候,变量调试窗口就会显示范围内的所有数据,如图1-105所示。
图1-104 输入监视表达式
图1-105 变量调试窗口
在这里可以设置对象的标签、检查对象、计算表达式、添加变量到监视窗口等。
1.Inspect
在Variable窗口右击变量或表达式,选择Inspect命令,弹出一个非模式检查窗口,如图1-106所示。这个窗口可以脱离主窗口。
图1-106 Inspect窗口
2.Mark Object
在Variable窗口右击变量或表达式,选择Mark Object命令,弹出窗口,输入标签,也可以选中颜色,如图1-107所示,为对象添加标签,看起来更加直观。
图1-107 为对象添加标签
1.3.10.6 调试控制工具
调试控制工具用来管理调试程序的运行,提供了以下常用功能。
暂停、恢复程序执行。
终止进程。
查看、禁止断点。
获取线程堆栈。
Debugger窗口的调试控制工具按钮及对应的功能如图1-108所示。
图1-108 调试控制工具
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。