
2.3 Android Studio调试
编写代码很多时候都是“差强人意”,很难一次获得想要的结果,出现错误的时候需要查找错误的原因,这种查找的过程称为“程序调试”。一般来讲程序员10%的时间写代码,90%的时间都在调试,因此要认识到调试的重要性。调试的方式有多种,这里介绍最常用的两种:Logcat调试方式和断点调试方式。
2.3.1 Logcat调试
Logcat调试方式很简单,在可能出现错误的地方将变量的值打印出来,方便分析总结错误原因。
这里编写一个简单的Java程序,代码如下:
private int calculateMultiply(int i) { return i * i; } int[] testInts = new int[10]; public void test(View view) { int i = 0; while (i <10) { i++; int i2 = calculateMultiply(i); testInts[i-1] = i2; Log.d(TAG, "onCreate: " +testInts[i-1]); } }
使用while循环不断计算i*i的值并通过Log打印出来,这时查看Logcat窗口中的Log信息如图2.60所示。

图2.60 Logcat窗口中的Log信息
这里通过TAG(MainActivity)来过滤日志信息,可以看出所有的i*i都被打印出来了,根据打印的值即可初步判断是否发生错误。
2.3.2 断点调试
断点调试相对于Logcat调试要复杂一些,与Logcat显示运行后的结果相比,断点调试可以暂停程序的运行而获得运行中的结果。断点调试可以分成几个步骤,下面一一介绍。
1.添加断点
在想要调试的代码行的左边栏单击即可添加一个断点,如图2.61所示。

图2.61 添加断点
从图2.61可以看出,在i++处添加了一个断点,下面就可以单击工具栏中的调试按钮开始调试。
2.开始调试
单击工具栏中的调试按钮,如图2.62所示。

图2.62 调试按钮
此时进入调试准备阶段,查看底部的监视窗,如图2.63所示。

图2.63 调试监视窗一
图2.61中所示的test方法是按钮的单击事件监听,因此单击模拟器中的按钮触发进入调试阶段,如图2.64所示。

图2.64 调试监视窗二
由图2.64可以看出,此时由Console切换到了Debugger标签,我们可以根据窗口内的工具栏按钮或快捷键来控制程序的运行。常用的调试方式有三种(Step Over、Step Into、Step Out),下面一一介绍。
Step Over,可以控制程序向下运行一步。有两种方式可以操作,其中一种是单击工具栏中的按钮,如图2.65所示。

图2.65 Step Over按钮
当然也可以使用快捷键F8来控制,这时查看代码编辑区,如图2.66所示。

图2.66 使用快捷键F8代码调试下一步
从图2.66可以看出,此时代码已由断点处向下运行了一行(蓝色背景行)。
Step Into,这个操作可以进入到调试中遇到的方法体中。例如上面的操作中遇到了calculateMultiply方法,想要进入到这个方法体中就可以单击工具栏中的Step Into按钮,如图2.67所示。

图2.67 Step Into按钮
同样也可以使用快捷键F7进行操作,再次查看代码编辑区,如图2.68所示。

图2.68 代码调试进入方法中
从图2.68可以看出,此时代码调试运行到方法calculateMultiply中了,在程序的右边显示出了这时方法的参数i的值。
若上面的步骤中进入了一个比较繁复的方法,而我们没有耐心一步步执行到最后,可以使用Step Out按钮跳出来,如图2.69所示。

图2.69 Step Out按钮
同样可以使用Shift+F8快捷键进行操作,再次查看代码编辑区,如图2.70所示。

图2.70 代码调试-跳出方法
这时又跳到了刚才进入的地方,这时再按F8快捷键又可以向下运行了。
2.3.3 高级调试
1.变量值设置
对于有些for循环或while循环,一步步执行可能需要耗费很多时间,例如上面的while循环,我们想查看i为9时的值,若一步步执行就需要执行9遍,会比较烦,有没有比较好的方式呢?当然,我们可以设置变量的值,在监视面板中选择要改变数值的变量,右击,如图2.71所示。

图2.71 代码调试-变量值设置一
在弹出的快捷菜单中选择Set Value,输入数值,如图2.72所示。

图2.72 代码调试-变量值设置二
按Enter键即可设置成功,这时再次到代码中查看,如图2.73所示。

图2.73 代码调试-变量值设置三
可以看出,此时i变量的值已经变成了9。
2.断点跳转
一般来讲,一次调试过程可能涉及多个断点,这时就可能需要断点间跳转的功能,例如在图2.74中的程序中添加了两个断点。

图2.74 代码调试-断点跳转一
假设运行到第一个断点查看变量值之后,想迅速跳转到第二个断点,这时就可以单击调试框中的Run to Cursor按钮快速跳转,如图2.75所示。

图2.75 代码调试-断点跳转二
当然也可以通过快捷键Alt+F9来实现,如图2.76所示。

图2.76 代码调试-断点跳转三
可以看出,直接跳转到了第二个断点。
3.表达式/方法值计算
若调试的代码中有一些表达式或方法值需要计算,就需要用到Evaluate Expression功能。选中需要计算的表达式或方法,右击,在弹出的快捷菜单中选择Evaluate Expression,如图2.77所示。

图2.77 代码调试-计算表达式值一
在弹出的对话框中单击Evaluate按钮即可计算表达式的值,如图2.78所示。

图2.78 代码调试-计算表达式值二
在Result栏中显示出计算值。
4.查看所有断点
单击调试监视框左边栏的View Breakpoints即可查看所有断点,如图2.79所示。

图2.79 代码调试-查看所有断点
当然也可以使用快捷键Ctrl+Shift+F8来打开。此外,还有一个可以查看所有断点的入口,选择Run→View Breakpoints,打开查看界面,如图2.80所示。

图2.80 代码调试-查看所有断点界面
这时在左边栏中就可以看到所有的断点,在右下角还可以看到断点在代码中的位置,单击左上角的 “+”和 “-”可以添加或删除断点。
5.停止调试
不想继续调试时,单击左边栏的Stop按钮停止调试,如图2.81所示。

图2.81 代码调试-停止调试
停止后的监视窗如图2.82所示。

图2.82 代码调试-停止调试后视图