今天的文章,我要记录的就是有关调试的技巧,不论你是否已经掌握,都值得一看。对了,文章的截图是我利用下班时间整理的,所以一般会很晚回去,到家都是十点半左右,因为时间还是比较仓促的,有些地方遗漏或者不正确的,欢迎指正!下面进入正题。

1. 调试窗口

先来一张大图,途中详细标注了调试窗口中,各个常用的功能区域和按键。如果你觉得图片看不清,可以选择在单独的标签页打开,然后放大看(实在不行,可以留下邮箱我单独发)。

android 修改sepolicy后快速调试的方法_计算表达式

图中我把整个调试界面分了5个区域,每个区域作用各不相同,而且有些说明不是很到位,下面再针对个别地方补充一下:

1.1 调整Debug窗口(可选)

可能大家 AS 的Debug 窗口布局跟我的不一样,我习惯于我现在的模式,想看啥都方便。其实你也可以自己调节的,见下图:

android 修改sepolicy后快速调试的方法_标签页_02

1.2 A区

执行到光标处:这个按键在图示中说的有点乱,再补充几句,然后来一张图。程序debug过程中,有时候我们想直接让程序直接debug到某处,这时就可以使用该按键。与之相辅的还有强制执行到光标处,二者的 使用区别 可以看下图。

android 修改sepolicy后快速调试的方法_标签页_03

计算表达式:有关计算表达式,再单独补充一张使用说明书,哈哈。

android 修改sepolicy后快速调试的方法_计算表达式_04

1.3 C区

C区分为FramesThreads ,各自功能已经在大图中介绍了。说实话,C区我用的很少,实际的作用我说不上来几个,但有一个作用我还是要推荐给你们。

在实际开发中,一个项目比较大,好多人维护,有些不是你写的界面你肯定不熟悉入口在哪。当然,你可以选择在问这是谁开发的,找到他然后问他入口在哪,但是我不建议这么做,原因有二:其一,这么简单的问题你去问别人?其二,别人很忙,我想身为程序员的你,也不想被人随便打断吧。其实我就这么一说,要是大家都去直接问,我还用接着往下说吗?(笑cry)

既然不问,那就自己找,其实真的一点都不麻烦。我们在项目中肯定有基类 BaseActivity 吧,然后每个界面Act都会继承该基类。那么就好办了。在 BaseActivityonCreate() 方法中打个断点,然后点进你想找入口类的那个界面,这时候,断点停在 BaseActivityonCreate() 方法中了。接下来,把目光转到C区 Frames 标签页面,看看你能发现什么?为了更形象,我准备了一张图,直接上图,我也不用继续往下说了:

android 修改sepolicy后快速调试的方法_快捷键_05

1.3 D区和E区

D区和E区图示不是很形象,再补充一下。

我们一般会在D区观察变量的值,但除此之位,我们可以根据调试需要随时修改变量的值。举个栗子,有个boolean值,是服务端返回的,我们拿到这个值,会根据 true 或者 false 做不同的处理,然而服务端总是返回 true,我们想验证 false 的情形怎么办?当然你可以加一行代码强制改一下,事后再删除,但我想说这样很 low(虽然我以前也这么干)。这时候你就可以在变量区找到这个变量,方法有2个,原理都一样:其一,使用前面说“计算表达式”;其二,点击变量,右击选择 set value... (win快捷键F2)。

有时候,D区变量很多,而我们关心的往往只是那么一两个变量,这时候,你就需要 Watches 功能,将你感兴趣的变量添加到 Watches 窗口,单独观察(VIP待遇)。添加的方法有2个,原理还是一样:其一,在D区右击变量,选择 Add to Watches ;其二,在 E 区点击左上角 +,输入变量名。

android 修改sepolicy后快速调试的方法_标签页_06

2. 断点技巧

这块直接上图,要上班来不及了哈哈,途中已经很形象的说明了。至于实际的使用场景,我会尽可能提示,最终还是要靠自己去实践哈。

2.1 条件断点

顾名思义,带有条件的断点,一般在循环时用的比较多。

android 修改sepolicy后快速调试的方法_标签页_07

2.2 日志断点

如果我们很关心某个变变量的变化过程,一般会使用Log打印一堆值来观察,观察完了再删除,说真的有点麻烦。这时候,你需要日志断点,看图:

android 修改sepolicy后快速调试的方法_计算表达式_08

图中最后那句“而不是 Message”窗口,改成“而不是 Android Monitor 窗口”。

2.3 异常断点

所谓异常断点,是用来监听程序中的异常,一旦程序崩溃,会直接定位到异常所在的确切位置。我个人觉得这个有点鸡肋,因为崩溃日志里面会带有出错代码的行号,也能够直接定位。或者说我还没有发现他真正强大的作用吧,我只能这么安慰自己。

下面我们以监听程序中运行时异常为例,意思就是在debug过程中,一旦程序崩溃,无论你在哪,AS 会帮助我们立马定位到崩溃的位置。看图,分三步:

第一步,调出“breakpoints”断点管理界面(win快捷键Ctrl + Shift + F8):

android 修改sepolicy后快速调试的方法_快捷键_09

第二步,添加我们感兴趣的异常断点,以添加 RuntimeException 为例:

android 修改sepolicy后快速调试的方法_计算表达式_10

第三步,故意设雷,验证一下。其实此处是 NullPointerException,但看源码知道 NullPointerException extends RuntimeException,所以一样会捕获:

android 修改sepolicy后快速调试的方法_快捷键_11

3. 结束

OK,大概就这些,写完发现又没时间睡觉了,校审一遍没什么大问题。希望本文能对你有所帮助,如果本文有任何错误,或者有更好的想法,欢迎一起交流学习!