天大的缘分   发表于 2017-01-12 16:01:53

收藏 675 11

Android Studio调试技巧分享,帮你解决调试问题

  我们在写代码时不可避免有Bug,通常情况下除了日志最直接的调试手段就是debug;那么你的调试技术停留在哪一阶段呢?仅仅是下个断点单步执行吗?或者你知道 Evaluate Expression, 知道条件断点;可是你听说过日志断点吗,Method Breakpoint, Exception Breakpoint 呢?还有高大上的 Field Watchpoint ?

  

几种不同的断点


  几种不同的断点你有关注过Android Studio旁边断点的区别吗?比如上图三个断点有什么不同?且听我一一道来。


  调试基础

  一般来说我们有两种办法调试一个debuggable的apk;其一是下好断点,然后用debug模式编译安装这个app;其二是 attach process,在Android Studio里面就是这么一个对话框:

  

Attach Process


  Attach Process第二种方法比较常用,我们可以在启动apk之后,直接下断点,然后attach process到制定进程,条件触发之后就可以直接进入调试模式。

  其他的一些单步执行,step into, step out, force step into 等就不提了;基本的跟踪手段。

  还是提一下,下断点最简单的办法,是在代码编辑器的左侧,行号右边鼠标点击一下即可。


  Evaluate Expression

  这个功能非常实用,可以在断点处直接进入一个求值环境,在这里你可以执行任何你感兴趣的表达式;如下图:

  

Evaluate Expression


  Evaluate Expression比如在断点处有一个对象object,如果你要查看它的某个属性很简单,在Debug窗口就能看到,但是如果你想要执行它的某个方法看看结果是什么呢?借助这个可以实现。当然它的功能远不止这么多,相当于直接进入了一个 REPL环境,非常实用。忘了说了,快捷键 Alt + F8 :P

  条件断点

  假设你的断点在一个列表的循环里面,可是你只对这个列表的某一个元素感兴趣,只想在遇到这个元素的时候才断下来;你是一直人肉 F9 直到满足条件吗?条件断点就是满足这种需求的,顾名思义,在特定条件下的断点。使用起来也非常简单,在你的断点上鼠标右键会出现一个小窗口,写上条件即可。

  

  

条件断点


  条件断点日志断点

  很多时候我们调试的时候更多的是打印日志定位异常代码,缩小范围之后再使用断点解决问题;所以经常做的事情就是在代码里面添加日志信息,输出函数参数,返回信息,输出我们感兴趣的变量信息等。

  但是这么做一个问题就是,我们添加了日志代码需要重新编译;在没有 Instant Run 之前的黑暗时代这么做是非常痛苦的,每次编译少则几十秒,多则几分钟;这样无意义的等待简直就是折磨;其实,除了热部署工具,我们还可以使用日志断点解决这个问题。

  首先我们在想要输出信息的地方下一个断点;然后右键这个断点,在出现的设置框里面把这个断点的 suspend 属性设置为 False ,这样虽然叫做“断点”,但是并不会真正断下来;然后,我们在 log message 里面填上我们想要输出的日志信息。如下图(注意标红位置):

  

日志断点


  日志断点这样,每次代码执行到这个断点的位置,这个可爱的断点并不会使我们的程序停下来,而是输出我们告诉它的日志信息,然后继续执行;非常方便。


  方法断点

  传统的调试方式是以行为单位的,所谓单步调试;但是很多时候我们关心的是某个函数的参数,返回值;(回想一下我们使用日志的时候打印的最多的信息难道不是函数的参数和返回值吗?)使用方法断点,我们可以在函数级别进行调试;如果经常跳进跳出函数或者只对某个函数的参数感兴趣,这种类型的断点非常实用。具体使用方法有两种方式;最简单的是在你感兴趣的方法头那一行打上断点,这时候你会发现断点图标有点不一样,这就是方法断点了,如下图:

  

方法断点


  方法断点另外一种方式是通过断点设置窗口, 后面介绍。

  异常断点

  在有些情况下,我们只对某些特定的异常感兴趣,或者我们只对异常感兴趣;我们希望只要程序发生异常程序就能断下来;这好像保存现场一样,只要发生命案了(异常),第一时间保存现场,这样什么指纹之类的线索就会清晰很多,坏蛋就算想逃也是插翅难飞啊。

  Android Studio给了我们这个能力!那就是异常断点!可以在特定异常发生的时候,直接让整个程序断下来;如果你对所有异常感兴趣,直接 Throwable 即可。从零开始学Android的话,Android Studio最好要熟练掌握。

  具体做法是,进入 Run -> View BreakPoints 或者使用快捷键打开断点设置窗口;如下图:

  

断点设置窗口


  断点设置窗口点击左上角的 ➕ ,会出现一个选择框;选择Exception Breakpoint;然后会出现一个对话框,选择你感兴趣的异常:

  

异常断点


  异常断点Field WatchPoint

  在上面我们添加异常断点的时候,点击加号的时候,有四个选项;第一个就是我们前面所说的第二种方法断点的添加方式,第三个是异常断点,那么第二个 Field WatchPoint 是干什么的呢?

  有没有这样一种场景:你发现某个值莫名其妙滴不知道什么时候被谁给修改了,罪魁祸首是谁?Java虽然是值传递,但是引用也可以是值;对象全部存放在堆上面,而堆是被所有线程共享的,因此在非常复杂的场景下,你根本不知道这些共享变量被谁修改了,这样非常危险;在多线程环境下,不变性是一个很重要的特性,我们看到高并发的语言诸如 Erlang, Scala 对于这种不变性都有着某种程度的支持。

  好吧,扯远了;那么我们怎么揪出这个修改我们值的捣蛋鬼呢?那就是这个 Field WatchPoint的功能了;使用它我们可以在某个Field被访问或者修改的时候让程序断下来;完美解决这个问题。

  下断点的方式和方法断点类似,也有两种;第一种是直接在某个字段的声明处下断点,这时候断点图标会改变,如下图:

  

Field WatchPoint


  Field WatchPoint右键这个断点我们可以进行一些设置,比如默认是被修改的时候断下来,你也可以改为每次访问这个字段就断下来。

  另外一种方式是 Run -> View BreakPoint 打开设置,与异常断点类似。

  远不止这么多

  上面介绍了这么多给力的功能,其实还有很多细节;打开断点设置窗口(Run -> View Breakpoint`):

  


  我们可以对感兴趣的类,感兴趣的某个特定对象下断点,也可以设置断点的次数,还能使断点在特定的线程才断下来;这些细节就不详细介绍了,大家自己去发掘!

  希望以上内容可以帮到大家。

此帖被开心0001 于2017年09月08日 13:15 取消设置为精华帖
全部回复共11条
电梯直达
我要回复
  • 开心0001 2017-01-26 22:53:45

    1楼

    谢谢分享

      开心0001 2017-10-19 21:59:43 1#1楼

      嘿嘿,3Q

      评论

      开心0001回复  开心0001 2018-05-26 22:17:47 2#1楼

      几种不同的断点你有关注过Android Studio旁边断点的区别吗?比如上图三个断点有什么不同?

      评论

      PanYeeChing回复  开心0001 2018-06-03 23:39:21 3#1楼

      几种不同的断点你有关注过Android Studio旁边断点的区别吗?比如上图三个断点有什么不同?且听我一一道来

      评论

      开心0001回复  PanYeeChing 2018-06-03 23:47:45 4#1楼

      也有两种;第一种是直接在某个字段的声明处下断点

      评论

      PanYeeChing回复  开心0001 2018-06-10 22:53:00 5#1楼

      一个settings.gradle,build.gradle分别放在了根目录和moudle目录下,下面是gradle文件的构成图

      评论

      开心0001回复  PanYeeChing 2018-06-06 11:48:23 6#2楼

        几种不同的断点你有关注过Android Studio旁边断点的区别吗?比如上图三个断点有什么不同?且听我一一道来。

      评论

      开心0001回复  PanYeeChing 2018-06-13 17:36:36 7#3楼

      ;可是你听说过日志断点吗,Method Breakpoint, Exception Breakpoint 呢?还有高大上的 Field Watchpoint ?

      评论

      开心0001回复  PanYeeChing 2018-06-13 17:37:36 8#4楼

      ;可是你听说过日志断点吗,Method Breakpoint, Exception Breakpoint 呢?还有高大上的 Field Watchpoint ?

      评论

      PanYeeChing回复  PanYeeChing 2018-06-14 20:26:31 9#5楼

      我想很多初次接触Lisp语言的人, 一定也有过类似的感受。Lisp的语法太次了。一个语言的发明人, 居然不肯用心弄出一套漂亮的语法

      评论

      开心0001回复  PanYeeChing 2018-06-15 17:27:42 10#6楼

      知道条件断点;可是你听说过日志断点吗,Method Breakpoint, Exception Breakpoint 呢?

      评论

  • 伊芙琳 2017-02-27 09:20:07

    2楼

      开心0001 2017-10-19 21:59:50 1#1楼

      嘿嘿,3Q

      评论

      开心0001 2017-11-15 14:21:52 2#2楼

      嘿嘿,加油,一起进步,哈哈。

      评论

      开心0001 2018-02-06 23:47:56 3#3楼

      哈哈,喜欢听什么歌呢?最近好感伤啊!

      评论

      开心0001回复  开心0001 2018-06-27 11:58:52 4#1楼

      然我们现在讨论的所有内容都是基于Android studio的,所以请先行下载相关工具。

      评论

      开心0001 2018-03-09 13:14:00 5#4楼

      资源表现层状态转化 每一个URI代表一种资源

      评论

      BankYeeChing 2018-04-19 18:13:49 6#5楼

      具体做法是,进入 Run -> View BreakPoints 或者使用快捷键打开断点设置窗口

      评论

      开心0001回复  BankYeeChing 2018-05-07 20:40:47 7#1楼

      在上面我们添加异常断点的时候,点击加号的时候,有四个选项

      评论

      开心0001回复  BankYeeChing 2018-05-13 16:44:48 8#2楼

      Evaluate Expression, 知道条件断点;可是你听说过日志断点吗,Method Breakpoint, Exception Breakpoint 呢?还有高大上的 Field Watchpoint ?

      评论

      开心0001回复  BankYeeChing 2018-05-14 23:15:29 9#3楼

      Method Breakpoint, Exception Breakpoint 呢?还有高大上的 Field Watchpoint ?

      评论

      开心0001回复  BankYeeChing 2018-05-17 17:06:42 10#4楼

      其他的一些单步执行,step into, step out, force step into 等就不提了;基本的跟踪手段。

      评论

  • 于樣同学 2017-05-27 22:34:50

    3楼

    不错哦 谢谢分享

      开心0001 2017-10-19 21:59:55 1#1楼

      嘿嘿,3Q

      评论

      开心0001 2017-11-15 14:21:56 2#2楼

      嘿嘿,加油,一起进步,哈哈。

      评论

      开心0001 2018-02-06 23:48:08 3#3楼

      哈哈,喜欢听什么歌呢?最近好感伤啊!

      评论

      开心0001 2018-02-06 23:48:13 4#4楼

      哈哈,喜欢听什么歌呢?最近好感伤啊!

      评论

      开心0001 2018-03-09 13:14:05 5#5楼

      资源表现层状态转化 每一个URI代表一种资源

      评论

      BankYeeChing 2018-04-19 18:13:57 6#6楼

      具体做法是,进入 Run -> View BreakPoints 或者使用快捷键打开断点设置窗口

      评论

      开心0001 2018-04-22 23:31:33 7#7楼

      我们在写代码时不可避免有Bug,通常情况下除了日志最直接的调试手段就是debug

      评论

      PanYeeChing 2018-04-24 19:28:23 8#8楼

      然后用debug模式编译安装这个app

      评论

      开心0001 2018-04-26 18:42:32 9#9楼

      或者你知道 Evaluate Expression, 知道条件断点;可是你听说过日志断点吗

      评论

      开心0001 2018-05-03 21:32:27 10#10楼

      我们在写代码时不可避免有Bug,通常情况下除了日志最直接的调试手段就是debug

      评论

  • 棒棒的小孩 2017-05-28 19:45:19

    4楼

    最近刚开始学习 我要努力!

      开心0001 2017-10-19 21:59:58 1#1楼

      嘿嘿,3Q

      评论

      开心0001 2017-11-15 14:22:00 2#2楼

      嘿嘿,加油,一起进步,哈哈。

      评论

      开心0001 2018-02-06 23:50:25 3#3楼

      哈哈,喜欢听什么歌呢?最近好感伤啊!

      评论

      BankYeeChing 2018-04-19 18:14:01 4#4楼

      具体做法是,进入 Run -> View BreakPoints 或者使用快捷键打开断点设置窗口

      评论

      开心0001 2018-04-22 23:31:35 5#5楼

      我们在写代码时不可避免有Bug,通常情况下除了日志最直接的调试手段就是debug

      评论

      PanYeeChing 2018-04-24 19:28:27 6#6楼

      然后用debug模式编译安装这个app

      评论

      开心0001 2018-04-26 18:42:35 7#7楼

      或者你知道 Evaluate Expression, 知道条件断点;可是你听说过日志断点吗

      评论

      PanYeeChing 2018-04-26 18:58:53 8#8楼

      一般来说我们有两种办法调试一个debuggable的apk;其一是下好断点,

      评论

      开心0001 2018-05-03 21:32:32 9#9楼

      我们在写代码时不可避免有Bug,通常情况下除了日志最直接的调试手段就是debug

      评论

      开心0001 2018-05-04 23:41:20 10#10楼

      Attach Process第二种方法比较常用,我们可以在启动apk之后

      评论

  • Laster 2017-05-31 19:54:01

    5楼

    谢谢分享 了解了

      开心0001 2017-10-19 22:00:01 1#1楼

      嘿嘿,3Q

      评论

      开心0001回复  开心0001 2018-06-03 23:48:02 2#1楼

      也有两种;第一种是直接在某个字段的声明处下断点

      评论

      开心0001 2017-11-15 14:22:03 3#2楼

      嘿嘿,加油,一起进步,哈哈。

      评论

      开心0001 2018-02-06 23:50:29 4#3楼

      哈哈,喜欢听什么歌呢?最近好感伤啊!

      评论

      开心0001 2018-03-09 13:14:11 5#4楼

      哈哈哈

      评论

      BankYeeChing 2018-04-19 18:14:12 6#5楼

      具体做法是,进入 Run -> View BreakPoints 或者使用快捷键打开断点设置窗口

      评论

      开心0001 2018-04-22 23:31:40 7#6楼

      我们在写代码时不可避免有Bug,通常情况下除了日志最直接的调试手段就是debug

      评论

      PanYeeChing 2018-04-24 19:28:32 8#7楼

      然后用debug模式编译安装这个app

      评论

      开心0001 2018-04-26 18:42:37 9#8楼

      或者你知道 Evaluate Expression, 知道条件断点;可是你听说过日志断点吗

      评论

      PanYeeChing 2018-04-26 18:58:55 10#9楼

      一般来说我们有两种办法调试一个debuggable的apk;其一是下好断点,

      评论

  • Laster 2017-06-03 19:18:07

    6楼

    很不错呢 继续努力!

      开心0001 2017-10-19 22:00:04 1#1楼

      嘿嘿,3Q

      评论

      开心0001 2017-11-15 14:22:06 2#2楼

      嘿嘿,加油,一起进步,哈哈。

      评论

      开心0001 2018-02-06 23:50:34 3#3楼

      哈哈,喜欢听什么歌呢?最近好感伤啊!

      评论

      开心0001 2018-03-09 13:14:15 4#4楼

      资源表现层状态转化 每一个URI代表一种资源

      评论

      BankYeeChing 2018-04-19 18:14:19 5#5楼

      具体做法是,进入 Run -> View BreakPoints 或者使用快捷键打开断点设置窗口

      评论

      开心0001 2018-04-22 23:31:45 6#6楼

      我们在写代码时不可避免有Bug,通常情况下除了日志最直接的调试手段就是debug

      评论

      PanYeeChing 2018-04-24 19:28:35 7#7楼

      然后用debug模式编译安装这个app

      评论

      开心0001 2018-04-26 18:42:42 8#8楼

      或者你知道 Evaluate Expression, 知道条件断点;可是你听说过日志断点吗

      评论

      PanYeeChing 2018-04-26 18:59:00 9#9楼

      一般来说我们有两种办法调试一个debuggable的apk;其一是下好断点,

      评论

      开心0001 2018-05-03 21:32:46 10#10楼

      我们在写代码时不可避免有Bug,通常情况下除了日志最直接的调试手段就是debug

      评论

  • 棒棒的小孩 2017-06-04 23:07:44

    7楼

    厉害了 不错

      开心0001 2017-10-19 22:00:09 1#1楼

      嘿嘿,3Q

      评论

      BankYeeChing回复  开心0001 2018-04-19 18:14:26 2#1楼

      具体做法是,进入 Run -> View BreakPoints 或者使用快捷键打开断点设置窗口

      评论

      开心0001回复  BankYeeChing 2018-05-07 20:42:56 3#1楼

      在上面我们添加异常断点的时候,点击加号的时候,有四个选项

      评论

      PanYeeChing回复  BankYeeChing 2018-06-14 20:27:11 4#2楼

      我想很多初次接触Lisp语言的人, 一定也有过类似的感受。Lisp的语法太次了。一个语言的发明人, 居然不肯用心弄出一套漂亮的语法

      评论

      开心0001 2017-11-15 14:22:09 5#2楼

      嘿嘿,加油,一起进步,哈哈。

      评论

      开心0001 2018-02-06 23:50:37 6#3楼

      哈哈,喜欢听什么歌呢?最近好感伤啊!

      评论

      开心0001 2018-03-09 13:14:42 7#4楼

      带动资源表现层状态转化 每一个URI代表一种资源

      评论

      PanYeeChing 2018-04-24 19:28:38 8#5楼

      然后用debug模式编译安装这个app

      评论

      开心0001 2018-04-26 18:42:44 9#6楼

      或者你知道 Evaluate Expression, 知道条件断点;可是你听说过日志断点吗

      评论

      PanYeeChing 2018-04-26 18:59:05 10#7楼

      一般来说我们有两种办法调试一个debuggable的apk;其一是下好断点,

      评论

  • Laster 2017-06-16 16:37:14

    8楼

    很好的内容啊 不错不错

      开心0001 2017-10-19 22:00:13 1#1楼

      嘿嘿,3Q

      评论

      开心0001 2017-11-15 14:22:13 2#2楼

      嘿嘿,加油,一起进步,哈哈。

      评论

      BankYeeChing 2018-04-19 18:14:31 3#3楼

      具体做法是,进入 Run -> View BreakPoints 或者使用快捷键打开断点设置窗口

      评论

      开心0001 2018-04-26 18:42:49 4#4楼

      或者你知道 Evaluate Expression, 知道条件断点;可是你听说过日志断点吗

      评论

      PanYeeChing 2018-04-26 18:59:10 5#5楼

      一般来说我们有两种办法调试一个debuggable的apk;其一是下好断点,

      评论

      开心0001 2018-05-09 23:59:20 6#6楼

      ,使用这个方法前提是该物体挂了个Collider

      评论

      开心0001 2018-05-13 16:45:08 7#7楼

      Evaluate Expression, 知道条件断点;可是你听说过日志断点吗,Method Breakpoint, Exception Breakpoint 呢?还有高大上的 Field Watchpoint ?

      评论

      开心0001 2018-05-18 22:35:02 8#8楼

      v

      评论

      开心0001 2018-05-26 22:18:11 9#9楼

      几种不同的断点你有关注过Android Studio旁边断点的区别吗?比如上图三个断点有什么不同?

      评论

      开心0001 2018-06-03 23:48:16 10#10楼

      也有两种;第一种是直接在某个字段的声明处下断点

      评论

  • 于樣同学 2017-06-17 22:29:19

    9楼

    谢谢分享 希望楼主加油!

      开心0001 2017-10-19 22:00:16 1#1楼

      嘿嘿,3Q

      评论

      开心0001 2017-11-15 14:22:17 2#2楼

      嘿嘿,加油,一起进步,哈哈。

      评论

      开心0001 2018-02-06 23:50:42 3#3楼

      哈哈,喜欢听什么歌呢?最近好感伤啊!

      评论

      开心0001 2018-05-09 23:59:23 4#4楼

      ,使用这个方法前提是该物体挂了个Collider

      评论

      开心0001 2018-05-13 16:45:13 5#5楼

      Evaluate Expression, 知道条件断点;可是你听说过日志断点吗,Method Breakpoint, Exception Breakpoint 呢?还有高大上的 Field Watchpoint ?

      评论

      开心0001 2018-06-06 11:48:50 6#6楼

        几种不同的断点你有关注过Android Studio旁边断点的区别吗?比如上图三个断点有什么不同?且听我一一道来。

      评论

      开心0001 2018-06-21 17:27:21 7#7楼

      可是你听说过日志断点吗,Method Breakpoint, Exception Breakpoint 呢?还有高大上的 Field Watchpoint ?

      评论

      开心0001 2018-07-03 18:55:51 8#8楼

      想了解更多关于材质编辑器中皮肤材质的相关扩展知识,可以在文章末端左下角点击“阅读原文” 跳转到官方文档。

      评论

      PanYeeChing 2018-07-07 21:00:03 9#9楼

      tail -n 10 test.log 查询日志尾部最后10行的日志;

      评论

  • Silence _sa 2018-02-05 15:44:17

    10楼

    3Q

      开心0001 2018-02-06 23:50:46 1#1楼

      哈哈,喜欢听什么歌呢?最近好感伤啊!

      评论

      开心0001 2018-05-09 23:59:25 2#2楼

      ,使用这个方法前提是该物体挂了个Collider

      评论

      开心0001 2018-06-21 17:27:25 3#3楼

      可是你听说过日志断点吗,Method Breakpoint, Exception Breakpoint 呢?还有高大上的 Field Watchpoint ?

      评论

      开心0001 2018-07-03 18:55:55 4#4楼

      想了解更多关于材质编辑器中皮肤材质的相关扩展知识,可以在文章末端左下角点击“阅读原文” 跳转到官方文档。

      评论

      PanYeeChing 2018-07-07 21:00:08 5#5楼

      tail -n 10 test.log 查询日志尾部最后10行的日志;

      评论

  • 青鱼365 2018-02-05 22:58:36

    11楼

    QQQ

      开心0001 2018-02-06 23:50:51 1#1楼

      哈哈,喜欢听什么歌呢?最近好感伤啊!

      评论

      开心0001 2018-05-09 23:59:30 2#2楼

      ,使用这个方法前提是该物体挂了个Collider

      评论

      开心0001 2018-06-21 17:27:29 3#3楼

      可是你听说过日志断点吗,Method Breakpoint, Exception Breakpoint 呢?还有高大上的 Field Watchpoint ?

      评论

加载中...
关闭
关闭
QQ
交流群
邀请
好友
App
下载
意见
反馈
返回
顶部