AndroidStudio调试之旅

来源:互联网 发布:太原java工程师待遇 编辑:程序博客网 时间:2024/05/19 22:06

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

开启调试模式

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

这里写图片描述

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

这里写图片描述

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

调试区域介绍

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

这里写图片描述

功能键 名称 功能描述 这里写图片描述 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 添加观察属性,调试时能方便观察该属性变化。

断点类型

这里写图片描述

左侧断点类型介绍

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

增加观察变量

这里写图片描述

动态修改变量值

这里写图片描述

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

这里写图片描述

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

这里写图片描述

条件断点

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

这里写图片描述

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

这里写图片描述

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

异常断点应用

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

开启异常断点

这里写图片描述

执行程序,跟踪结果

这里写图片描述

这里写图片描述

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

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

原创粉丝点击