前言:写代码不可避免有Bug。一般状况下除了日志最直接的调试手段就是debug。
当咱们的程序出现bug时,调试可以高速的找到bug。进入调试状态。咱们可以清晰的了解程序的整个运行过程,可以对内存的数据进行监视。如下就简单总结一下调试的基本使用和一些调试的技巧。html
本文是经过查找网上的多方资源整理而来。假设有谬误的地方请你们指出,但愿本文能对你有所帮助。多线程
1、插入断点
选定要设置断点的代码行。在行号的区域后面单击鼠标左键就能够
2、进入调试状态
设置好断点后,点击工具栏中的小臭虫(Debug)进入调试状态。
当一个应用进入调试状态后,Android Studio会弹出这样的Debug窗体,即调试者状态。咱们在这里可以对咱们的程序进行监视和调试。
IDE下方出现Debug视图。在①区域中显示了程序运行到断点处所调用过的所用方法,越如下的方法被调用的越早;在②区域可以给指定的变量赋值(鼠标左键选择变量,右键弹出菜单选择setValue...)。这个功能可以更加高速的检測你的条件语句和循环语句。在③区域中可以对某一个特定的变量进行监视,在高级调试部分会再次讲到。
3、常用的调试方式和快捷键
1.常用调试功能及快捷键:
- step into (F7):进入子函数
- step over (F8):越过子函数,但子函数会运行
- step out (Shift + F8):跳出子函数
- Run to Cursor (Alt + F9) 运行到光标所在的位置。
- show Execution Point (Alt + F10) 高速定位当前调试的位置,并将该行高亮的显示出来。
2.调试功能解释
- step into:就是单步运行。遇到子函数就进入并且继续单步运行。好比当你运行到System.out.println("XXXX")时。使用这个功能时就会进入到System.out.println方法所在类的println方法下(固然这样作事没有必要的,假设进入了想跳出运行step out就可以了。
)
并发
- step over:是在单步运行时,在函数内遇到子函数时不会进入子函数内单步运行,而是将子函数整个运行完再中止,也就是把子函数整个做为一步。
好比上面的样例中。System.out.println("XXXX")运行完后是跳到下一个语句中而不会跳进去,这个功能也是比較常用的,一直按F8就可以了。
函数
- step out:就是但单步运行到子函数内时,用step out就可以运行完子函数余下部分,并返回到上一层函数。
- Run to Cursor:运行到光标所在的位置,运行该功能后,不论你运行到哪里,程序都可以运行到你光标的所在行下。
- show Execution Point:当你不知道程序当前已经运行到哪里的时候,就可以使用这个功能,Android Studio 会跳到运行行所在的界面,并将该行高亮的显示出来。
4、高级调试功能
以上的调试方法仅仅是简单调试。如下介绍一些比較高大上的调试功能。
一、Evaluate Expression
这个功能颇有用。可以在断点处直接进入一个求值环境,在这里你可以运行不论什么你感兴趣的表达式;例如如下图:
比方在断点处有一个对象 object ,假设你要查看它的某个属性很easy,在Debug窗体就能看到,但是假设你想要运行它的某个方法看看结果是什么呢?借助这个可以实现。固然它的功能远不止这么多。至关于直接进入了一个 REPL 环境,颇有用。忘了说了,快捷键 Alt + F8 :P
二、条件断点
假设你的断点在一个列表的循环里面,但是你仅仅对这个列表的某一个元素感兴趣,仅仅想在遇到这个元素的时候才断下来;你是一直人肉 F9 直到知足条件吗?条件断点就是知足这样的需求的,顾名思义,在特定条件下的断点。使用起来也很easy,在你的断点上鼠标有件会出现一个小窗体,写上条件就能够。
三、日志断点
许多时候咱们调试的时候许多其它的是打印日志定位异常代码,缩小范围以后再使用断点解决问题;因此常常作的事情就是在代码里面加入日志信息,输出函数參数,返回信息。输出咱们感兴趣的变量信息等。
但是这么作一个问题就是,咱们加入了日志代码需要又一次编译;在没有 Instant Run 以前的黑暗时代这么作是很痛苦的。每次编译少则几十秒。多则几分钟;这样无心义的等待简直就是折磨。事实上,除了热部署工具,咱们还可以使用日志断点解决问题。
首先咱们在想要输出信息的地方下一个断点;而后右键这个断点。在出现的设置框里面把这个断点的 suspend 属性设置为 False 。这样尽管叫作“断点”,但是并不会真正断下来;而后,咱们在 log message 里面填上咱们想要输出的日志信息。
例如如下图(注意标红位置):高并发
这样,每次代码运行到这个断点的位置。这个可爱的断点并不会使咱们的程序停下来,而是输出咱们告诉它的日志信息,而后继续运行;很方便。
四、方法断点
传统的调试方式是以行为单位的。所谓单步调试。但是许多时候咱们关心的是某个函数的參数。返回值。(回忆一下咱们使用日志的时候打印的最多的信息难道不是函数的參数和返回值吗?)用法断点,咱们可以在函数级别进行调试;假设常常跳进跳出函数或者仅仅对某个函数的參数感兴趣,这样的类型的断点颇有用。详细用法有两种方式。最简单的是在你感兴趣的方法头那一行打上断点,这时候你会发现断点图标有点不同,这就是方法断点了,例如如下图:
第二种方式是经过 断点设置窗体 , 后面介绍。
五、异常断点
在有些状况下,咱们仅仅对某些特定的异常感兴趣,或者咱们仅仅对异常感兴趣;咱们但愿仅仅要程序发生异常程序就能断下来。这好像保存现场同样。仅仅要发生命案了(异常)。第一时间保存现场,这样什么指纹之类的线索就会清晰许多。坏蛋就算想逃也是插翅难飞啊。
Android Studio给了咱们这个能力!那就是 异常断点 !可以在特定异常发生的时候。直接让整个程序断下来。假设你对所有异常感兴趣。直接 Throwable 就能够。
详细作法是,进入 Run -> View BreakPoints 或者使用快捷键打开断点设置窗体。例如如下图:
点击左上角的 :heavy_plus_sign: 。会出现一个选择框;选择 Exception Breakpoint ;而后会出现一个对话框,选择你感兴趣的异常:
六、Field WatchPoint
在上面咱们加入异常断点的时候,点击加号的时候,有四个选项;第一个就是咱们前面所说的第二种方法断点的加入方式。第三个是异常断点。那么第二个 Field WatchPoint 是干什么的呢?
有没有这样一种场景:你发现某个值莫名其妙滴不知道何时被谁给改动了,罪魁祸首是谁?Java尽管是值传递,但是引用也可以是值;对象所有存放在堆上面,而堆是被所有线程共享的,所以在很复杂的场景下,你根本不知道这些共享变量被谁改动了。这样很危急;在多线程环境下,不变性是一个很重要的特性,咱们看到高并发的语
言诸如 Erlang , Scala 对于这样的不变性都有着某种程度的支持。
好吧,扯远了;那么咱们怎么揪出这个改动咱们值的捣蛋鬼呢?那就是这个 Field WatchPoint 的功能了;使用它咱们可以在某个 Field 被訪问或者改动的时候让程序断下来。完美解决问题。
下断点的方式和方法断点类似,也有两种;第一种是直接在某个字段的声明处下断点,这时候断点图标会改变。例如如下图:
右键这个断点咱们可以进行一些设置,比方默认是被改动的时候断下来,你也可以改成每次訪问这个字段就断下来。
第二种方式是 Run -> View BreakPoint 打开设置。与异常断点类似。
兴许:由于本人能力有限,仅仅能总结到这里,事实上关于调试的功能还有许多需要总结。会在之后的时间里对文章进行改动和添加。但愿本文能让你们有所收获。^-^
如下是关于Android Studio调试方面的博文,供你们查看
相关连接: