Android开发技巧分享:AS Debug还能这么玩?

徐璆
• 阅读 129
作者:Geekholt

debug 是日常开发中非常重要的技能,并不仅限于单步调试这些简单的使用,其实对于一些第三方 aar甚至系统源码,还支持运行中不阻塞再不修改这些源码的基础上打日志等非常多的技巧。

而且这属于一个实用且可以长期使用的技能,付出一点时间,长期的收益是非常明显的。

目录

Android开发技巧分享:AS Debug还能这么玩?

Debug断点跟踪调试是开发过程中分析代码、解决BUG的一个重要手段,很多程序员的调试水平往往停留在单步执行阶段,因为单步执行往往就可以解决大部分的问题。但是一个优秀的程序员不仅仅要解决问题,还要高效地解决问题,本文将介绍一些非常方便的调试技巧。

基本使用

Debug App有两种途径:

第一种是直接点击下图运行按钮右侧的小虫状图标,运行并调试当前Project

Android开发技巧分享:AS Debug还能这么玩?

第二种就是调试当前已经处于运行状态下的App,点击运行按钮右侧第五个按钮,弹出Choose Process窗口,选择对应的进程,点击OK按钮即可进入调试模式,此时,我们便可以在需要的地方直接下断点调试代码了

Android开发技巧分享:AS Debug还能这么玩?

接下来就是常见的调试方法了,在Debug窗口顶部工具栏有一排操作按钮,比如Step Over(单步执行)、Step Into(进入方法)等,如图所示:

Android开发技巧分享:AS Debug还能这么玩?

打断点和取消断点最直接的方式就是单击目标代码行的行号右侧空白处,然后在Debug窗口左侧有个断点浏览按钮View Breakpoints,位于停止按钮下方第一个,可以浏览Project中的所有断点,同时可以添加删除断点

Android开发技巧分享:AS Debug还能这么玩?

条件断点

有时候,我们的断点打在了循环体里面,但是我们只想看某一特定循环次数下的运行情况,难道要不停地跳至下一次断点直至满足我们的要求吗?

Android开发技巧分享:AS Debug还能这么玩?

条件断点可以自己输入条件,比如for循环中输入i == 5即可让程序直接运行至第六次循环

Android开发技巧分享:AS Debug还能这么玩?

日志断点

打印日志也是跟踪程序分析问题的一个非常有效的手段,但是如果我们的程序已经运行并且处于调试模式,此时如果想打印日志来分析代码,难道还要停止调试、添加Log代码并重新编译运行吗?

如果使用日志断点,就不用这么繁琐了。右键点击断点,在弹出的窗口中取消勾选Suspeng复选框(即表示程序运行至此断点时不会停下来供开发者调试),然后勾选Evaluate and log,并输入打印语句即可。这样,当Debug模式下的程序执行至此,不会停下来,而是在控制台中打印对应信息

Android开发技巧分享:AS Debug还能这么玩?

Android开发技巧分享:AS Debug还能这么玩?

变量赋值

比如,我们的代码里有一个变量,这个变量的值会影响到程序的执行结果。如果我们想观察这个变量在不同的赋值下程序的执行结果怎么办呢?

难道要一遍遍的在代码里修改变量值,然后重新运行程序吗?

显然这是非常麻烦的操作。如果利用Debug模式下的变量赋值(Set Value),只需要运行一次,就能达到我们的观察效果。

在使用该变量的代码处打个断点,然后在Variables窗口找到对应的变量,修改变量值并执行即可。

如这里我们可以把b的值改为false,那么Toast输出的值就是Hi

Android开发技巧分享:AS Debug还能这么玩?

Android开发技巧分享:AS Debug还能这么玩?

变量观察

在Variables变量区和Watches观察区可以查看Debug模式下,程序执行到断点处的变量值或者对象的各属性值,如果程序比较复杂变量很多看起来就有点不方便。

那么就可以通过弹出窗口的形式查看属性值,只要将光标定位至断点代码行所用到的变量,IDE会自动弹出一个小窗口,如下图所示,此时,使用对应的快捷键或者点击这个小窗口里的变量即可弹出变量属性值窗口,Mac下的快捷键位command + F1,如图所示:

Android开发技巧分享:AS Debug还能这么玩?

我们也可以使用New watch,方便我们更快定位到需要观察的变量

Android开发技巧分享:AS Debug还能这么玩?

 对象求值

在断点处,如果有变量对象,系统提供了表达式求值功能,针对Variables视图中的变量对象,我们可以输入任何计算语句,实时查看表达式计算结果。

具体操作为,右键Variables视图中的变量对象,选择Evaluate Expression,弹出表达式窗口,输入任何你想要的计算语句,点击Evaluate计算按钮,即可显示计算结果

Android开发技巧分享:AS Debug还能这么玩?

方法断点

当我们想要观察某个方法的调用时机,可以使用方法断点

这里有一个小建议,我们可以在写一个方法的时候,在方法注释中列出方法入参,这样一方面是可以给入参增加一些注释,同时在打断点的时候,也能非常直观的看到方法入参的值

Android开发技巧分享:AS Debug还能这么玩?

变量断点

有时候,我们想知道自定义的变量的何时何地发生了改变,就可以使用变量断点。在变量定义行打断点,开启Debug模式,在程序执行的过程中,如果该变量的值发生改变,程序会自动停下来,并定位在改变变量值的地方。这里要注意的是,对于引用数据类型,通过set方法改变内部的值并不会触发变量断点,只有引用的地址发生改变才会触发

Android开发技巧分享:AS Debug还能这么玩?

Android开发技巧分享:AS Debug还能这么玩?

异常断点

程序在执行的过程中可能会出现各种各样的未知性异常,如果能在发生异常的时候第一时间让程序停下来,并定位到异常出现的地方,而不是让应用直接崩溃,那样有时候能帮助我们更方便定位问题

打开断点管理器,点击工具栏菜单Run,选择View Breakpoints;在Debug窗口直接点击View Breakpoints图标。点击左上角加号按钮,可以添加各种断点,包括前文提到的Method Breakpoints和Field Watchpoints断点,这里我们选择Exception Breakpoints异常断点,在弹出的Enter Exception Class窗口中输入需要监控的异常类别即可

Android开发技巧分享:AS Debug还能这么玩?

Android开发技巧分享:AS Debug还能这么玩?

这样当我们运行下面的代码,IDE会自动帮我们定位到问题发生的位置

Android开发技巧分享:AS Debug还能这么玩?

总结

debug是非常非常基础的技术,所谓磨刀不误砍柴工,掌握一些小技巧,往往能帮我们更高效的解决一些问题。

本文抛砖引玉,希望大家在开发过程中多留心一些很基础的技术,有时候了解一些你认为很不起眼的知识点,能够帮助你解决一些很棘手的问题。

但是,在多线程环境下,光靠 debug 是不够的。有时 debug 本身会带来一些问题混淆了现场,比如因为 debug 时的卡顿造成环境不一致等等,这时应该学会使用打日志的形式帮忙调试,平时打日志的时候也应该多注意一些规范,这样能更方便排查问题。


在这我也分享一份自己收录整理的Android学习PDF+架构视频+面试文档+源码笔记,还有高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料这些都是我闲暇还会反复翻阅的精品资料。在脑图中,每个知识点专题都配有相对应的实战项目,可以有效的帮助大家掌握知识点。

总之也是在这里帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习

如果你有需要的话,可以点赞+评论关注我加Vx:15388039515(备注思否,需要进阶资料)

Android开发技巧分享:AS Debug还能这么玩?

Android开发技巧分享:AS Debug还能这么玩?

Android开发技巧分享:AS Debug还能这么玩?

Android开发技巧分享:AS Debug还能这么玩?

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
DevOps世界中的软件开发
!(https://oscimg.oschina.net/oscnet/f40e68cbfe8148deb00f040b4e917a0a.jpg)在整个软件开发过程中,开发人员通常需要花费大量时间来修复错误和漏洞,以便一切按计划进行交付。但是,通过DevOps实践,可以更轻松地管理和保护这些问题。这是由于以下事实:使用DevOps实践的软
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这