这几天写了点基础模块,一口气写完,结果没跑通(╯﹏╰),免不了调试一把,调来调去有些心烦,就顺带把AS里的调试都看了一遍。调试作为一个开发者最基础的技能,也是很重要的一个手段,正巧就讲一讲一些基础的调试方法,具体要是感兴趣,可以去官网看看。
调试很简单,直接在代码的最右边,点击一下就会出现一个红点

然后点击菜单栏上的debug按钮(有两个,第一个是debug app,使app重新启动,然后进入debug,第二个是attach debugger,可以直接连接到正在运行的android process)


当程序跑到相应的断点,就会停在断点处。什么step into,step over的我就不讲了,这里讲一个Evaluate Expression。

在调试操作按钮的边上,一个像小计算机的图标(当然也有快捷键!ctrl+U)。这个Evaluate Expression是个求值表达式,可以在断点的时候,启动一个“计算器”,可以任意编辑表达式进行计算。使用这个的最方便之处在于,当断点处无法提供一些你想要的信息的时候,可以自己编写表达式,去查看结果。

分类
根据调试内容的划分,可以分为“字段调试”、“方法调试”、“异常调试”。
字段调试

字段调试的红点是有一杠的,在字段处断点,右键小红点,还可以设置其断点属性。

当右键点击后,可以选择是访问的时候断,或者是修改的时候断,我们注意到,上面还有一个Condition,这个是做什么的呢。假设,这个断点是在一个循环当中,且值一直在变化,你是不停地人工watch然后不停地人工next直到找到想要的value吗?NONONO,这太累了,Condition就是用来增加条件筛选符合的value的,只有符合condition的语句,才会断点,这可以大大提升你的debug效率,是不是感觉轻松了很多。
方法调试

方法调试的红点是四个小点,断点后,可以断到所有用到该方法的位置。这里介绍一下Debug面板

最右边是frames层,也就是整个breakpoint被断的路径,可以一层层的往上查看,中间的Variables是可以看到当前场景里的变量值,watches是观察器,可以选中某个变量,右键Add to Watches,可以一直观测该变量的变化。
异常断点
讲异常断点前,我们先来看一下view breakpoints

菜单栏中找到run->View Breakpoints,会看到这么一个界面

在这个界面中,我们可以看到,在左侧的几行中,能看到不同的exception的断点,只要选中,程序就会在发生异常的时候,被断住。其实这个不是重点,我们先来讲个情景。当我们在调试的时候,会想着打log,通过console看log的值来定位问题,但是这个log你又不是一开始就写了,往往是断点调着调着发现,哎,我这里想看一下a这个值是多少,然后坑次坑次地写上一句Log.i("a", a);关键是你还要编译一遍,哇,这你要等多久啊,小项目还好,大项目动不动就5-6分钟,完了你还不一定会记得这里有个test的 log,忘了删了。然后我就要请出我们的主角,evaluate and log。


我们把suspend这个勾给去掉,他是用来决定是否断停的,如果勾去掉,debug还在,但是不会在这个地方断住,然后勾住log message to console和evaluate and log,在编辑框里写上你要的Log语句,就可以在logcat里看到相对应的log了,而且并没有改动源代码,也不会生成多余的代码,是不是感觉很方便。
总结
好了,调试的基本用法,大致就以上几种。相信学会这些方法后,一定可以提升我们平时Coding调试的效率,更快的解决问题。
网友评论