Android(安卓)Studio调试技巧(基于Android(安卓)Studio 3.1.2版本)
Android Studio调试技巧(基于Android Studio 3.1.2版本)
- 1. 开启调试的两种方式
- 2. Android Studio提供的调试面板
- 3. 调试功能区
- 3.1 how Execution Point(Alt+F10)
- 3.2 Step Over(F6)
- 3.3 Step Into(F5)
- 3.4 Force Step Into(Alt+Shift+F7)
- 3.5 Step Out(F7)
- 3.6 Drop Frame(未验证成功)
- 3.7 Run to Cursor(Ctrl+R)
- 4. 求值表达式(Evaluate Expression)
- 4.1 取值
- 4.2 设置值
- 5. 断点管理区
- 5.1 Pause Program
- 5.2 Resume Program(F8)
- 5.3 Stop (Ctrl+F2)
- 5.4 View Breakpoints (Ctrl + Shift + F8)
- 5.5 Mute Breakpoints
- 5.6 Get thread dump
- 5.7 Settings
- 5.7.1 Show Values Inline
- 5.7.2 Feature is not supported by the target VM
- 5.7.3 Auto-Variables Mode
- 5.7.4 Sort values alphabetically
- 6. 变量观察区
- 7. 断点的分类
- 7.1 条件断点
- 7.2 日志断点
- 7.3 异常断点
- 7.4 方法断点
- 7.5 Filed WatchPoint
- 8 博客来源
1. 开启调试的两种方式
Android Studio中有两种调试方式,Debug app和Attach process,如下图:
这两者的区别如下:
2. Android Studio提供的调试面板
Android studio中提供的调试面板(标准情况下):
可以看出,android studio大体为我们提供了6个功能区:
- 调试功能区
- 断点管理区
- 求值表达式
- 线程帧栈区
- 对象变量区
- 变量观察区
下面我们分别对这6个区域进行介绍。
3. 调试功能区
该区提供了调试的主要操作,主要有:
- Show Execution Point(Alt+F10)
- Step Over(F6)
- Step Into(F5)
- Force Step Into(Alt+Shift+F7)
- Step Out(F7)
- Drop Frame
- Run to Cursor(Ctrl+R)
3.1 how Execution Point(Alt+F10)
图标:
点击该按钮,光标将定位到当前正在调试的位置。
3.2 Step Over(F6)
图标:
单步跳过,点击该按钮将导致程序向下执行一行。如果当前行是一个方法调用,此行调用的方法被执行完毕后再到下一行。
3.3 Step Into(F5)
图标:
单步跳入,执行该操作将导致程序向下执行一行。如果该行有自定义的方法,则进入该方法内部继续执行,需要注意如果是类库中的方法,则不会进入方法内部。
3.4 Force Step Into(Alt+Shift+F7)
图标:
强制单步跳入,和step into功能类似,主要区别在于:如果当前行有任何方法,则不管该方法是我们自行定义还是类库提供的,都能跳入到方法内部继续执行。
3.5 Step Out(F7)
图标:
单步跳出按钮,和step into 功能相反。主要作用是:跳出当前执行的方法或循环。
3.6 Drop Frame(未验证成功)
图标:
大意理解为中断执行,并返回到方法执行的初始点,在这个过程中该方法对应的栈帧会从栈中移除.换言之,如果该方法是被调用的,则返回到当前方法被调用处,并且所有上下文变量的值也恢复到该方法未执行时的状态。简单的举例来说明:
public class DebugDemo { private String name = "default"; public void alertName() { System.out.println(name); debug(); } public void debug() { this.name = "debug"; } public static void main(String[] args) { new DebugDemo().alertName(); }}
当你在调试debug()时,执行该操作,将回调到debug()被调用的地方,也就是alertName()方法。如果此时再继续执行drop frame,将回调到alertName()被调用的地方,也就是main()。
3.7 Run to Cursor(Ctrl+R)
图标:
忽视已经存在的断点,跳转到光标所在处。也可以在要跳转到的代码处使用鼠标右键选择Run to Cursor或Force Run to Cursor使程序运行到当前光标所在位置。
4. 求值表达式(Evaluate Expression)
图标:
点击该按钮会在当前调试的语句处嵌入一个交互式解释器,在该解释器中,你可以执行任何你想要执行的表达式进行求值操作。
4.1 取值
比如,我们在调试时执行到以下代码:
此时执行Evaluate Expression,就相当于在调试行之前嵌入了一个交互式解释器,那么在该解释器中我们能做什么呢?在这里,假设我们想看下mAvtiveVAS中第一个元素的值:对着想要求值得位置点击鼠标右键,选择evaluate Expression。此时会显示如下:
在弹出的输入框中输入求值表达式,比如这里我们输入mActiveVAS.get(0),并点击执行,结果如下图:
4.2 设置值
在调试过程中,我们可以方便的修改某个变量的值。同样,使用4.1的例子我们执行如下mActiveVAS.add(new HashMap())添加一个变量,如下:
5. 断点管理区
5.1 Pause Program
图标:
点击该按钮将暂停应用的执行,如果想要恢复则可以使用下面提到的Resume Program。
5.2 Resume Program(F8)
图标:
该操作有恢复应用的含义,但是却有两种行为:
- 在应用处在暂停状态下,点击该按钮将恢复应用运行。
- 在很多情况下,我们会设置多个断点以便调试。在某些情况下,我们需要从当前断点移动到下一个断点处,两个断点之间的代码自动被执行,这样我们就不需要一步一步调试到下一个断点了,省时又省力。
5.3 Stop (Ctrl+F2)
点击该按钮会通过相关的关闭脚本来终止当前进程。在Android项目中点击该按钮,则意味这app结束运行。
5.4 View Breakpoints (Ctrl + Shift + F8)
图标:
点击该按钮会进入断点管理界面,在这里你可以查看所有断点,管理或者配置断点的行为,如:删除,修改属性信息等:
5.5 Mute Breakpoints
图标:
使用该按钮来切换断点的状态:启动或者禁用。在调试过程中,你可以暂时禁用所有的断点以实现应用正常的运行。该功能非常有用,比如当你在调试过程——突然不想让断点干扰你所关心的流程时,可以临时禁用断点。
5.6 Get thread dump
图标:
获取线程Dump,点击该按钮将进入线程Dump界面,下图红框区为工具区:
线程工具区中最常用的是:
该工具可以用来过滤线程,其他风名知意,就不做解释了。
从线程Dump的截图我们可以看到,每个线程前都有一个图标,接一来解释一下不同图标的意义。
线程状态描述 | 图标 |
---|---|
Thread is suspended. | |
Thread is waiting on a monitor lock. | |
Thread is running. | |
Thread is executing network operation, and is waiting for data to be passed. | |
Thread is idle. | |
Event Dispatch Thread that is busy. | |
Thread is executing disk operation. |
5.7 Settings
图标:
点击该按钮将打开有关设置的列表:
我们对其中的几个进行说明。
5.7.1 Show Values Inline
调试过程中开启该功能,将会代码右边显示变量值,即下图中红框所示部分:
5.7.2 Feature is not supported by the target VM
实际上不支持的feature为“Show Method Return Values”,其作用是:调试过程中启用该功能,将在变量区显示最后执行方法的返回值。如:
5.7.3 Auto-Variables Mode
开启这个功能后,IDE的Debugger会自动评估某些变量,大概就是当你执行在某个断点时,Debugger会检测当前调试点之前或者之后的变量的状态,然后在变量区选择性输出。举个例子来说明,未开启该功能之前,变量区输出所有的变量信息:
开启之后,当你调试到第13行时,Debugger检测到num变量在之后没有被使用,那么在变量区就不会输出该变量的信息。
5.7.4 Sort values alphabetically
开启这个功能的化,变量区中的输出内容会按照按字母顺序进行排序。
6. 变量观察区
图标:
该区域将显示你所感兴趣的变量的值。在调试模式下,你可以通过Add to Watches将某个变量添加到观察区,该值的变化将会在变量观察区显示。操作如下:
这里我们对name比较感兴趣,希望看到它的值的变化情况,因此我们将其“特殊关照”。需要注意,此时因为name是成员变量,因此在对象观察区也可看到该值。如果是局部变量,无疑只能用这种方式了。
7. 断点的分类
断点是调试器的功能之一,可以让程序暂停在需要的地方,帮助我们进行分析程序的运行过程。
在Android Studio中,断点又被以下五类:
- 条件断点
- 日志断点
- 异常断点
- 方法断点
- 属性断点
其中方法断点是我们最熟悉的断点类型,相信没有人不会。下面我们着重介绍其他四种类型的断点。
7.1 条件断点
所谓的条件断点就是在特定条件发生的断点,也就是,我们可将某个断点设置为只对某种事件感兴趣,最典型的应用就是在列表循环中,我们希望在某特定的元素出现时暂停程序运行。比如,现在我们有个list中,其中包含了q1, q2, q3, q4四个元素,我们希望在遍历到q2时暂停程序运行,那么需要进行如下操作:
- 在需要的地方添加断点,如下:
- 断点处左键单击,在Condition处填写过滤条件。此处我们只关心2q,因此填写s.equals(“2q”),如下:
7.2 日志断点
该类型的断点不会使程序停下来,而是在输出我们要它输出的日志信息,然后继续执行。具体操作如下:
同样在断点处左键单击,在弹出的对话框中取消选中Suspend。
在弹出的控制面板中,选中Evaluate and log,然后再填写想要输出的日志信息,如下:
当调试过程遇到该断点将会输出结果,如下:
7.3 异常断点
所谓的异常断点就是在调试过程中,一旦发生异常(可以指定某类异常),则会立刻定位到异常抛出的地方。比如在调试异常中,我们非常关注运行时异常,希望在产生任何运行异常时及时定位,那么此时就可以利用该类型异常,在上线之前,进行异常断点调试非常有利于减少正式环境中发生crash的几率。
具体操作如下:在Run菜单项中,选择View Breakpoints(也可以在断点管理面板中点击View Breakpoints),然后在弹出的面板中,在管理断点面板中点击“+”,如下:
在弹出的下拉选择列表中,我们选择Java Exception Breakpoints
这里我们选中Search By Name,在下面的输入框中输入我们所关心的异常类型。此处我们关心NullPointerException,在调试过程一旦发生NullPointerException,调试器就会定位到异常发生处。
7.4 方法断点
类似7.3节,在管理断点面板中通过“+”添加断点时,断点类型选择“Java Method Breakpoints”,在弹出的“Add method breakpoints”面板中输入信息,如:
随后在调试程序时,只要调用到指定类中的hideVASQuota,程序就会停住,如下:
7.5 Filed WatchPoint
断点图标如下:
Filed WatchPoint是本质上是一种特殊的断点,也称为属性断点:当我们某个字段值被修改的时候,程序暂停在修改处。通常在调试多线程时尤为可用,能帮我们及时的定位并发错误的问题。其使用和添加普通的断点并无不同,断点图标稍有不同。
8 博客来源
[1] 你所不知道的Android Studio调试技巧. https://www.jianshu.com/p/011eb88f4e0d/. 有修改和补充
更多相关文章
- Android(安卓)Audio代码分析15 - testPlaybackHeadPositionAfter
- Android(安卓)Launcher3 禁止用户拖动图标创建文件夹,控制拖动图
- 最新android视频地址及android4.2环境地址
- avd安装apk
- java多线程断点续传
- Android的FastBoot的安装与环境变量设置
- Android(安卓)-- 写xml到SD卡中
- mac如何android设备上运行react-native
- Android改变ExpandableListView的indicator图标实现方法