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

几种不同的断点

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

调试基础

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

Attach Process

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

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

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

Evaluate Expression

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

Evaluate Expression

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

条件断点

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

条件断点

日志断点

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

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

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

日志断点

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

方法断点

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

方法断点

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

异常断点

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

Android Studio给了我们这个能力!那就是异常断点!可以在特定异常发生的时候,直接让整个程序断下来;如果你对所有异常感兴趣,直接 Throwable 即可。

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

断点设置窗口

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

异常断点

Field WatchPoint

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

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

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

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

Field WatchPoint

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

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

远不止这么多

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

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

【编辑推荐】

【责任编辑:枯木 TEL:(010)68476606】

点赞 0

android studil打断点_Android Studio你不知道的调试技巧相关推荐

  1. android studio 热部署,Android Studio 你不知道的调试技巧

    原标题:Android Studio 你不知道的调试技巧 (点击上方公众号,可快速关注) 来源:伯乐在线专栏作者 - weishu http://android.jobbole.com/83282/ ...

  2. Android Studio你不知道的调试技巧

    写代码不可避免有Bug,通常情况下除了日志最直接的调试手段就是debug:那么你的调试技术停留在哪一阶段呢?仅仅是下个断点单步执行吗?或者你知道 Evaluate Expression, 知道条件断点 ...

  3. Visual Studio的调试技巧

    Visual Studio的调试技巧 [原文地址] Debugging Tips with Visual Studio 2010 [原文发表日期] 2010/8/19 10:48 AM 这是我写的关于 ...

  4. Android Studio eclipse 调试技巧

    如上图设置多个断点,开启调试.想跨断点移动到下一个断点,点击如下图1箭头,程序将运行一个断点到下一个断点之间需要执行的代码.如果后面代码没有断点,再次点击该按钮将会执行完程序.点击箭头2指向的按钮,可 ...

  5. android studil打断点_【小技巧】AndroidStudio利用断点打印日志

    你是不是有着这样的烦恼: 调试程序常常需要到处打印日志 (没办法,debug需要) 打印日志需要对代码进行修改 (改来改去一不小心就忘了删除,或者破坏了代码) 改完代码还要重新编译 (编译一次要等待好 ...

  6. Android Studio Flutter 调试技巧 Flutter Inspector 提升你的维护开发效率 轻松定位复杂嵌套Widget代码位置

    题记 -- 执剑天涯,从你的点滴积累开始,所及之处,必精益求精. Flutter是谷歌推出的最新的移动开发框架. [x1]微信公众号的每日提醒 随时随记 每日积累 随心而过 [x2]各种系列的视频教程 ...

  7. Android Studio 调试技巧大全

    转载请标明出处:http://blog.csdn.net/xx326664162/article/details/52169069 文章出自:薛瑄的博客 你也可以查看我的其他同类文章,也会让你有一定的 ...

  8. Visual Studio中11个强大的调试技巧和方法

    调试是软件开发周期中很重要的一部分.它具有挑战性,同时也很让人疑惑和烦恼.总的来说,对于稍大一点的程序,调试是不可避免的.最近几年,调试工具的发展让很多调试任务变的越来越简单和省时. 这篇文章总结了可 ...

  9. Visual Studio原生开发的20条调试技巧(下)

    我的上篇文章<Vistual Studio原生开发的10个调试技巧>引发了很多人的兴趣,所以我决定跟大家分享更多的调试技巧.接下来你又能看到一些对于原生应用程序的很有帮助的调试技巧(接着上 ...

最新文章

  1. Java 泛型 T,E,K,V,?,傻傻分不清?
  2. 关于:last-child的一点见解
  3. 普通程序员如何用1年时间获取3年成长?
  4. 旅途的意义- 献给二十五岁
  5. [GO]结构体成员的使用:普通变量
  6. gateway配置mysql_gateway中这样使用mysql正确么
  7. 目标检测——标注文件的格式设计
  8. Linux Kernel中irq handler, softirq handler 和 tasklet
  9. Maven安装和配置详细教程
  10. 【验证小白】只有SV+modelsim学验证(3)——加checker到环境中
  11. 求职必看~10分钟读懂国企、事业单位和公务员的区别
  12. 网络词典[U~Z](转)
  13. Nodejs ORM Prisma 介绍
  14. 中国第一程序员,微软得不到他就要毁了他!
  15. 2021-08-27-亚马逊 MWS 坑 handling time(handing time)
  16. Creo 工程图 尺寸 消失
  17. unity FBX模型导出系统源码WRP FBX Exporter下载
  18. 彻底搞懂阻抗控制、导纳控制、力位混合控制
  19. c语言时间函数状态,C语言的时间函数
  20. vue实现人员展示页面

热门文章

  1. redis学习笔记-持久化
  2. java并发编程(2)——wait和notify解析
  3. 横瓜执导众程序员开展大讨论关于C、JAVA及其它主流IT技术使用情况和优点缺点。...
  4. Acdream Xor 简单数学
  5. 【C++】C++0x :: Introduction to some amazing features
  6. hdu 1043 ,pku 1077 Eight ,八数码问题
  7. JQuery实现表格行当复制
  8. Silverlight Downloads
  9. JAVA项目中出现部分中文乱码问题
  10. AI服务器的优势有哪些?人工智能服务器产品有哪些?