AndroidStudio调试之旅

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

开启调试模式

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

AndroidStudio调试之旅_第1张图片

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

AndroidStudio调试之旅_第2张图片

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 代码和原生代码中的断点进行检查

调试区域介绍

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

AndroidStudio调试之旅_第3张图片
功能键 名称 功能描述
Rerun Android Debugger 重新恢复调试模式。
Resume Program 一直运行程序直到碰到下一个断点。
Pause Program 暂停程序,等待下一步操作。
Stop 停止当前调试。
View Breakpoints 查看你设置过的所有断点并可以设置断点的一些属性。
Mute Breakpoints 启用/禁用所有断点。
Show Execution Points 具体功能还待发掘
Step Over 程序向下执行一行,如果当前行有方法调用,这个方法执行完毕返回,然后到下一行。
Step Into 程序向下执行一行,如果当前行有用户自定义方法(非官方类库方法)调用,则进入该方法。
Force Step Into 程序向下执行一行,如果当前行有方法调用,则进入该方法。
Step Out 如果在调试的时候你进入了一个方法,并觉得该方法没有问题,你就可以使用step out跳出该方法,返回到该方法被调用处的下一行语句。值得注意的是,该方法已执行完毕。
Run to Cursor 一直运行到光标所在的位置。
Evaluate Expression 通过它可以查看当前类中所有的变量的值,并且可以计算表达式的值,甚至可以运行某个函数,得到结果。
New Watch 添加观察属性,调试时能方便观察该属性变化。

断点类型

AndroidStudio调试之旅_第4张图片
左侧断点类型介绍

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已经提供了强大的调试功能,可以很方便在调试过程中实时跟踪变量值变化或修改,以及表达式操作,日志输入等。

增加观察变量

AndroidStudio调试之旅_第5张图片

动态修改变量值

AndroidStudio调试之旅_第6张图片

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

AndroidStudio调试之旅_第7张图片


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

AndroidStudio调试之旅_第8张图片

条件断点

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

AndroidStudio调试之旅_第9张图片

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

AndroidStudio调试之旅_第10张图片

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

异常断点应用

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

开启异常断点
AndroidStudio调试之旅_第11张图片
执行程序,跟踪结果
AndroidStudio调试之旅_第12张图片
AndroidStudio调试之旅_第13张图片

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

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

你可能感兴趣的:(AndroidStudio调试之旅)