当前位置: 首页 > 科技观察

AndroidStudio你所不知道的调试技巧

时间:2023-03-17 19:12:26 科技观察

写代码的时候难免有bug。通常,除了日志之外,最直接的调试手段就是调试;那么你的调试技术停留在什么阶段呢?只是单断点Step执行?或者你知道EvaluateExpression和条件断点;但是你听说过日志断点、方法断点、异常断点吗?和高大的现场观察点?你有没有注意几个不同的断点?AndroidStudio旁边的断点有区别吗?比如上图中的三个断点有什么区别?让我一一告诉你。调试基础一般来说,我们有两种方法来调试可调试的apk;一种是设置好断点,然后在debug模式下编译安装app;另一种是附加进程,就是AndroidStudio中的这样一个对话框:AttachProcess第二种方法比较常用。我们可以在启动apk后直接设置断点,然后把进程attach到指定的进程上。条件触发后,我们就可以直接进入调试模式了。其他一些单步执行,stepinto,stepout,forcestepinto等就不说了;基本跟踪手段。不过,设置断点最简单的方法是在代码编辑器的左侧和行号的右侧单击鼠标。EvaluateExpression是一个非常有用的函数。你可以在断点处直接进入一个求值环境,在这里你可以执行你感兴趣的任何表达式;如下图所示:EvaluateExpression比如断点处有一个object对象,如果你想查看它的某个属性很简单,在Debug窗口中就可以看到,但是如果你想执行怎么办某种方法它能看到结果吗?这可以用来实现它。当然,它的功能远不止于此,相当于直接进入了一个REPL环境,非常实用。忘了说了,快捷键Alt+F8:P条件断点假设你的断点在一个列表的循环中,但是你只对这个列表的某个元素感兴趣,遇到这个你只想打开它元素。分解;一直按F9直到条件满足?条件断点就是为了满足这种需求。顾名思义,就是特定条件下的断点。使用起来也很简单,在你的断点上点右键,会出现一个小窗口,把条件写进去就可以了。条件断点Logbreakpoint很多时候我们在debug的时候会打印log来定位异常代码,然后在缩小范围后使用断点来解决问题;所以我们经常做的是在代码中添加日志信息,输出函数参数,返回信息,输出我们感兴趣的变量信息等。但是这样做的一个问题是我们添加了日志代码,需要重新编译;在InstantRun之前的黑暗时代做这个非常痛苦,每次编译从几十秒到几分钟不等;如此无意义的等待,简直就是折磨;其实除了热部署工具,我们还可以使用日志断点来解决这个问题。首先,我们在要输出信息的地方设置断点;然后右击断点,在出现的设置框中将断点的suspend属性设置为False。虽然这被称为“断点”,但事实并非如此。分解它;然后,我们在日志信息中填写我们要输出的日志信息。如下图(注意标红的位置):Logbreakpoint这样,每次代码执行到这个断点的位置,这个可爱的断点不会停止我们的程序,而是输出我们告诉它的log信息,然后继续执行;非常便利。方法断点传统的调试方法是以行为为单位的,即所谓的单步调试;但是很多时候我们关心某个函数的参数和返回值;(回想一下,我们使用日志时打印最多的信息不是函数的参数和返回值?)使用方法断点,我们可以在函数级别进行调试;如果您经常跳入和跳出函数或者只对某个函数的参数感兴趣,这种类型的断点非常有用。有两种使用方法;最简单的方法是在你感兴趣的方法头所在的行设置断点,这时候你会发现断点图标有点不一样了。这就是方法断点,如下图所示:方法断点另一种方法是通过断点来设置窗口,后面会介绍。异常断点在某些情况下,我们只对某些特定的异常感兴趣,或者我们只对异常感兴趣;我们希望只要程序有异常,程序就可以被破解;这就好比保存现场,只要发生命案(异常),第一时间保存现场,这样指纹之类的线索就会清晰很多,即使反派想逃也难飞.AndroidStudio给了我们这个能力!那就是异常断点!当特定的异常发生时,可以直接停止整个程序;如果您对所有异常感兴趣,只需Throwable。具体方法是进入Run->ViewBreakPoints或者使用快捷键打开断点设置窗口;如下图:点击断点设置窗口左上角的?,会出现一个选择框;选择异常断点;然后会出现一个对话框,选择你感兴趣的异常:exceptionbreakpointFieldWatchPoint当我们在上面添加异常断点时,当我们点击加号时,有四个选项;第一个是我们前面提到的Addingmethod的第二个方法断点,第三个是异常断点,那么第二个FieldWatchPoint是做什么用的呢?有没有这样一种场景:你发现某个值莫名其妙,不知道什么时候被谁修改了,谁是罪魁祸首??Java是按值传递的,但引用也可以是值;所有的对象都存储在堆上,而堆是所有线程共享的,所以在非常复杂的场景下,你根本不知道是谁修改了这些共享变量。这是非常危险的;在多线程环境下,不变性是一个非常重要的特性,我们已经看到Erlang、Scala等高并发语言都对这种不变性有一定程度的支持。好吧,它很远;那我们怎么找出这个修改我们值的麻烦制造者呢?这就是这个FieldWatchPoint的功能;使用它,我们可以在一个Field被访问或修改时停止程序;***解决这个问题。设置断点的方式与方法断点类似,也有两种;第一种是直接在一个字段的声明处设置断点,此时断点图标会发生变化,如下图:FieldWatchPoint右键点击这个断点,我们可以进行一些设置。比如修改的时候默认是break。您也可以将其更改为每次访问此字段时中断。另一种方法是打开Run->ViewBreakPoint的设置,类似异常断点。上面介绍了这么多强大的功能,其实还有很多细节;打开断点设置窗口(Run->ViewBreakpoint`):我们可以打断感兴趣的类,具体感兴趣的对象点,也可以设置断点的个数,也可以让断点只在特定的断点断线;这些细节就不详细介绍了,大家自己去了解吧!