Android Studio调试技巧(基于Android Studio 3.1.2版本)

1. 开启调试的两种方式

Android Studio中有两种调试方式,Debug app和Attach process,如下图:
在这里插入图片描述
这两者的区别如下:

  • Debug app:以调试模式安装运行,断点可以在运行之前设置,也可在运行后设置,是多数人最常用的调式方式。
  • Attach process:和Debug方式相比,能够将调试器attach到任何正在运行的进程。比如,我们可以通过attach process到想要调试的进程。然后,在需要的地方设置相关断点即可。
  • 在具体调试过程,自行酌情选择即可。

    2. Android Studio提供的调试面板

    Android studio中提供的调试面板(标准情况下):
    在这里插入图片描述
    可以看出,android studio大体为我们提供了6个功能区:

    1. 调试功能区
    2. 断点管理区
    3. 求值表达式
    4. 线程帧栈区
    5. 对象变量区
    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)

    图标:
    在这里插入图片描述
    该操作有恢复应用的含义,但是却有两种行为:

    1. 在应用处在暂停状态下,点击该按钮将恢复应用运行。
    2. 在很多情况下,我们会设置多个断点以便调试。在某些情况下,我们需要从当前断点移动到下一个断点处,两个断点之间的代码自动被执行,这样我们就不需要一步一步调试到下一个断点了,省时又省力。

    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中,断点又被以下五类:

    1. 条件断点
    2. 日志断点
    3. 异常断点
    4. 方法断点
    5. 属性断点

    其中方法断点是我们最熟悉的断点类型,相信没有人不会。下面我们着重介绍其他四种类型的断点。

    7.1 条件断点

    所谓的条件断点就是在特定条件发生的断点,也就是,我们可将某个断点设置为只对某种事件感兴趣,最典型的应用就是在列表循环中,我们希望在某特定的元素出现时暂停程序运行。比如,现在我们有个list中,其中包含了q1, q2, q3, q4四个元素,我们希望在遍历到q2时暂停程序运行,那么需要进行如下操作:

    1. 在需要的地方添加断点,如下:
      在这里插入图片描述
    2. 断点处左键单击,在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/. 有修改和补充

    猜你喜欢

    转载自blog.csdn.net/l460133921/article/details/82908557