在平常开发中难免会写出一些bug,明显的bug通过分析代码可以找出来问题所在,但也会有一些隐藏很深的bug,单凭肉眼分析代码很难定位,这个时候就需要编译器协助,AndroidStudio就提供了非常强大的调试功能,帮助我们能快速定位解决bug,告别加班!!!

开启调试模式

首先了解下开启调试的方法,在AndroidStudio中开启调试模式有两种方法,即普通Debug和Attach debugger to Android process,Debug模式大家可能经常用到,感受应该都是比较慢,特别大工程,等待时间就更长了,而另一种相对来说就快很多。

Android debug 没有backtrace信息 android debug模式_android-studio

针对Attach debugger 模式开启时会有提示选项 如下图:

Android debug 没有backtrace信息 android debug模式_调试_02

Auto
如果希望 Android Studio 自动选择最合适的选项,请选择此类型。例如,项目包含任何 C 或 C++ 代码,Android Studio 会自动使用 Hybrid 调试类型。否则,Android Studio 会使用 Java 调试类型。

Java
调试以 Java 编写的代码,请选择此类型 - Java 调试程序会忽略原生代码中设置的任何断点或监视。

在早期AndroidStudio 还有如下选项,本人用的AS3.0目前只有Auto/Java

Native
只想使用 LLDB 来调试代码,请选择此类型。使用此调试类型时,Java 调试程序会话视图不可用。默认情况下,LLDB 只检查原生代码,而会忽略 Java 代码中的断点。如果也想调试 Java 代码,则应切换到 Auto 或 Hybrid 调试类型。

Hybrid
在调试 Java 代码与调试原生代码之间切换,请选择此类型。Android Studio 会将 Java 调试程序和 LLDB 都连接到当前应用进程,一个用于 Java 调试程序,一个用于 LLDB,这样一来,就不必重新启动应用或更改调试配置,便可同时对 Java 代码和原生代码中的断点进行检查

调试区域介绍

接下来了解下调试功能面板(以下就是整个调试区域图)

Android debug 没有backtrace信息 android debug模式_bug_03

功能键

名称

功能描述

Android debug 没有backtrace信息 android debug模式_Java_04

Rerun Android Debugger

重新恢复调试模式。

Android debug 没有backtrace信息 android debug模式_调试_05

Resume Program

一直运行程序直到碰到下一个断点。

Android debug 没有backtrace信息 android debug模式_bug_06

Pause Program

暂停程序,等待下一步操作。

Android debug 没有backtrace信息 android debug模式_调试_07

Stop

停止当前调试。

Android debug 没有backtrace信息 android debug模式_调试_08

View Breakpoints

查看你设置过的所有断点并可以设置断点的一些属性。

Android debug 没有backtrace信息 android debug模式_bug_09

Mute Breakpoints

启用/禁用所有断点。

Android debug 没有backtrace信息 android debug模式_Java_10

Show Execution Points

具体功能还待发掘

Android debug 没有backtrace信息 android debug模式_android-studio_11

Step Over

程序向下执行一行,如果当前行有方法调用,这个方法执行完毕返回,然后到下一行。

Android debug 没有backtrace信息 android debug模式_Java_12

Step Into

程序向下执行一行,如果当前行有用户自定义方法(非官方类库方法)调用,则进入该方法。

Android debug 没有backtrace信息 android debug模式_Java_13

Force Step Into

程序向下执行一行,如果当前行有方法调用,则进入该方法。

Android debug 没有backtrace信息 android debug模式_编译器_14

Step Out

如果在调试的时候你进入了一个方法,并觉得该方法没有问题,你就可以使用step out跳出该方法,返回到该方法被调用处的下一行语句。值得注意的是,该方法已执行完毕。

Android debug 没有backtrace信息 android debug模式_调试_15

Run to Cursor

一直运行到光标所在的位置。

Android debug 没有backtrace信息 android debug模式_编译器_16

Evaluate Expression

通过它可以查看当前类中所有的变量的值,并且可以计算表达式的值,甚至可以运行某个函数,得到结果。

Android debug 没有backtrace信息 android debug模式_调试_17

New Watch

添加观察属性,调试时能方便观察该属性变化。

断点类型

Android debug 没有backtrace信息 android debug模式_调试_18

左侧断点类型介绍

Java Line Breakpoints 执行到当前行触发此断点

Java Method Breakpoints 断点位置与方法名同行,愈加方便的观察参数和返回值

Java Field Watchpoints 断点位于某个字段属性声明位置,当字段被重新赋值时触发断点

Java Exception Breakpoints 当抛出某个异常时,自动触发

Exception/Symbolic Breakpoints 未知

右侧功能区介绍

Enable 断点是否可用

Suspend 执行到断点时,程序是否暂停

Condition 执行此断点条件

Log message to console 执行到此断点时,打印一行日志

Evaluate log 执行到此断点时,打印一样的自定义日志,可以包含程序中的变量或表达式

Remove once hit 断点触发后移除

高级调试应用

很多时候简单的调试对于复杂的逻辑定位比较困难,有时可能需要反复尝试才能找出问题所在。特别对于一些代码量庞大的类,如果普通调试时要跟踪某个变量的变化是比较费时的,还有一些对于网络请求场景,如果要修改传递异常的参数,只能手动改代码,然后重新开始调试,可以说相当麻烦。然后AndroidStudio已经提供了强大的调试功能,可以很方便在调试过程中实时跟踪变量值变化或修改,以及表达式操作,日志输入等。

增加观察变量

Android debug 没有backtrace信息 android debug模式_编译器_19

动态修改变量值

Android debug 没有backtrace信息 android debug模式_bug_20

举个例子:对于方法test2中 ,只有当for循环里面条件满足 field1 == 3时才会给field1赋值并调用test3方法,此种场景中,如果当i < 100甚至 i< 1000,field1 == 90时,跟踪执行无疑会非常费时,但可以用更简单的方法实现,模拟满足这一条件,就是调试过程中改变field1成任意我们想要的值,怎么做呢?

Android debug 没有backtrace信息 android debug模式_Java_21



很简单,点击此变量,鼠标右键Set Value或F2,然后就可以设置成任意我们想要的值就可以了。

Android debug 没有backtrace信息 android debug模式_bug_22

条件断点

当执行到某一断点时,常规流程时,执行此断点,但由于某原因并不想立刻执行断点时,就可以使用条件断点,设置此断点执行条件,满足条件后再执行。

Android debug 没有backtrace信息 android debug模式_android-studio_23

设置断点条件后,只有当field1变量满足field1 == 3 时该断点才会执行,并打印日志,此过程并不阻碍代码执行。

Android debug 没有backtrace信息 android debug模式_编译器_24

可以看到,当满足断点执行条件后才执行,并打印了断点日志,对于此种情况大家可以举一反三,相信实际开发中能很大程度上提高调试效率。

异常断点应用

程序崩溃应该是所有程序员最深恶痛绝的吧,在我这明明是正常的,到你那怎么会崩溃呢?对于明显的崩溃情况都能快速定位出来,而对于隐藏较深的崩溃情况,可能还一时半会找不出原因所在,无法快速定位怎么办呢?是时候尝试下异常断点了,这种无需手动打断点,只需开启调试模式并在断点视图上选中Java Exception Breakpoints,然后执行,慢慢等待Bug露出原形了。

开启异常断点

Android debug 没有backtrace信息 android debug模式_android-studio_25

执行程序,跟踪结果

Android debug 没有backtrace信息 android debug模式_android-studio_26

Android debug 没有backtrace信息 android debug模式_android-studio_27

可以看到,整个过程并没有打任何断点,设置了异常断点后,发生Exception时自动定位代码行,并正常输出日志,是不是相当方便、快捷。

本文介绍内容对于AndroidStudio强大的调试功能,只是冰山一角,希望对大家有或多或少的帮助,减少Bug是我们的宗旨,远离加班是我们的理想。以后发现更好玩的调试功能继续完善!!!