Android Studio是一个非常优秀的开发工具,同时也内置了非常强大的调试方式,今天来学习一下Android Studio里的调试技巧。
1. 开启调试会话
方式一:运行调试
重新编译整个工程并进入Debug状态。如果开启了Instant Run,那么也具有Instant Run的特性。
方式二:附加进程调试
通过直接连接手机上正在运行的进程进行调试。如果一个测试人员拿过来一部程序运行到一半的手机,问你“这个网络调用怎么报错啊?”,这时使用这个功能就特别有用。
PS:只有在需要调试的那部分工程代码和进程匹配才能正确调试并定位问题,否则代码不知道会跳转到哪去~
选择要连接的进程
连接成功后在调试终端中会显示以下日志。
2. 断点Breakpoint
一、添加/删除断点
添加、删除断点无需多做介绍了。最简单的方式就是在每一行左边的空白处点击一下添加,再店家一下断点删除。
二、管理断点
打开断点管理窗口
左边列出工程中所有的断点,可以增加、删除、关闭断点。同时可以设置每个断点的属性。
- Enable:控制断点是否可用,不会删除该断点,只是控制断点是否可用。
- Suspend:控制运行到该断点时线程是否挂起。如关闭该选项,线程不会挂起,但依然会执行为该断点设置的其他功能。比如Log。
- Condition:设置执行该断点的条件,具体见条件断点。
- Log message to console:将断点自身的消息打印到console中。
- Log evaluated expression:打印自定义的表达式,具体件日志断点。
- Remove once hit:设置一次性的断点,执行过该断点就被删除。
- Disabled until selected breakpoint is hit:设置执行该断点的关联条件。
三、断点的分类
根据作用和调试场景的不同,Android Studio中的断点可以划分为以下几类断点:一般断点、条件断点、日志断点、方法断点、异常断点、成员观察点(Field WatchPoint)。各类断点没有明确的界限,有时需要相互配合使用才能快速地定位问题。
2.1 一般断点
一般断点通常配合单步调试使用。
单步调试
Android Studio提供了多种步进方式。
- Step Over:单步前进,不进入子方法;
- Step Into:单步前进,如果断点包含子方法则进入方法(不会进入官方类库的方法);
- Force Step Into:在Step Into 的基础上能进入任何方法;
- Smart Step Into:语句包含两个或者以上方法链式调用,可以选择进入那个方法,包括匿名内部类,Lamda表达式也可以;
- Step Out:单步前进,如果已在子方法里面则跳出;
- Run to Cursor:直接跳到光标定位的地方,这个功能非常有用。
- Drop Frame:点击该按钮后,你将返回到当前方法的调用处重新执行,并且所有上下文变量的值也回到那个时候。只要调用链中还有上级方法,可以跳到其中的任何一个方法;
- Resume Program:继续执行;
2.2 条件断点
在断点的位置设置条件,那只有符合条件的情况下才停下来,例如调试一个for循环的时候有几百次循环但是想看到某个次数时候则相当方便。
2.3 日志断点
勾选Log evaluated expression并填入表达式,执行到此断点时会在debug console中打印此表达式。可以根据需要去掉suspend。
2.4 方法断点
在方法开头设置,断点标识红色四黑点的标识。并且可以选择进入和退出方式时观察。
2.5 异常断点
设置异常断点,在程序发生异常的时候会进入断点。可以指定Any exception或特定类型的Exception。
2.6 成员观察点(Field WatchPoint)
为某个类的全局变量设置成员观察点,当该变量被访问或改变的时候进入断点。
3. 观察调试
- 在断点停留的时候,在变量上Alt+鼠标左键就能弹出变量信息窗口。
- 在Android Studio下方的Debug窗口的Variables中也会显示所有能定位到的变量。
- 可以在Watches窗口中添加关注的变量。这样在程序调试的过程中可以实时地观察该变量。并同时观察多个变量。
- 右键点击变量,选择Set Value可以实时更改变量值
- 右键点击变量,选择Mark Object进行标记
- 计算表达式,这个功能在调试时非常有用。点击下图的图标打开窗口:
Expression Mode下输入表达式进行Evaluate可以看到表达式的值:
Code Fragment Mode下输入代码片段可以看到最后一个表达式的值:
结束语
Android Studio的Debug技巧基本介绍结束了。本文中介绍了Android Studio开启Debug模式、断点的分类、观察变量值。在实际的Debug过程中,需要灵活地使用Debug技巧,才能快速地定位问题。