kniost

谁怕,一蓑烟雨任平生

0%

Android 常用高级调试技巧

在刚开始开发 Android 的时候,很多人只会使用 Log 调试以及简单的断点调试。但是为了更快速地调试,还是需要掌握一些高级一点的调试技巧,以提升自己的效率,下面是我找到和使用的一些技巧

1. 条件断点

条件断点(Conditional Breakpoints)指的是调试中为断点设置条件,当满足设置条件时程序就会停下。条件断点在循环中极为好用,比如有100次的循环,而你就想看第53次的程序运行过程,总不能一次一次运行看,这个时候就需要条件断点了。

用法:

在设置的断点上点击右键,就会弹出断点的简单设置对话框,在 Condition 框里面填写上你所需要中断的条件即可,此后调试程序时,程序就会在满足设置的条件时才会停下。

示例:

首先设置断点,在断点上右键,填写条件

执行 debug,会自动在满足条件处中断

2. 日志断点

顾名思义,日志断点(Logging Breakpoints)就是在断点处输出日志,从而避免了在代码中写 Log,然后再重新运行程序。

用法:

在设置的断点上右键,将 Suspend 置为非选中状态,然后会出现一些详细设置,在下面的 Log evaluated Expression 填写上你需要输出的信息。其实相当于调试程序在这里帮你打出了 Log,但是根据实际效果推测,由于还是一个断点,系统是先暂停,再打印 Log,最后再恢复,所以速度上会更慢一些。

示例:

首先设置断点,在断点上右键,反选 Suspend,填上需要 log 的信息。

执行 Debug 以后,会出现结果:

可以看到,sum 的值还没有发生变化时就已经 log 了,也就是说,在执行断点这行程序之前就已经进入断点了。在这个例子中,如果想看 sum 变化之后的值,就需要在 sum += i; 这行代码之后加断点。

3. 临时断点

临时断点(Temporary Breakpoints)只会在第一次运行到这个断点的时候停下,然后就会被自动移除了,在对不需要重复调试的地方比较有效。(其实我觉得可以叫一次断点)

用法:

Windows/ Linux : 按住 Alt 点击代码左侧断点位置
macOS : 按住 Option 点击代码左侧断点位置

如果在有断点的情况下再使用上述方法点击断点,将会使断点在有效和失效状态下切换。

4. 附着进程调试

附着进程调试(Attach debugger to Android process),在了解这个选项之前,总是喜欢点击调试,让 Gradle 重新编译,虽然有 Instant Run 的速度加持,但依然比较缓慢。
在这个模式下,你不需要重新编译,只要这个 App 是打开的,就可以直接点击该按钮,就可以快速进入调试,对于测试来说非常方便。

用法:

  1. 点击菜单栏中的 Run ->Attach Debugger to Android Process ,然后选择 App 所在的进程

  2. 或者点击下列按钮

5. 观察变量

在断点处停下时,将鼠标悬停在变量上或者按住 Option(Alt) 键点击变量时即可显示该变量的值

6. 计算表达式

计算表达式(Evaluate Expression),用来在调试过程中查看变量的值,或者计算任何复杂的自定义表达式。

但它最好的一点不仅是可以查看变量的值且进行运算,还能执行赋值语句!也就是说,它能在运行中实时修改变量,方便测试各种功能。

用法:

在断点中断后,按 Option(Alt) + F8,或者在 Run 菜单中找到 Evaluate Expression,然后输入想做的操作

示例:

首先在断点处停下,我设置的条件是 i == 6,此时 sum 的值为15

进入 Evaluate Expression,直接输入 sum 回车,能看到 sum 的值,也可以直接对 sum 进行修改,比如 sum +=20,结果是35

回到程序界面,发现 sum 的值已经改变了

这非常适合对于在后台服务器获取数据时调试一些需要后台修改的数据,省时省力