本文介绍使用Android Studio开发应用程序时进行断点调试相关的知识。干货满满,适合初学者学习。
1. 调试模式
想要进行断点调试,首先要进入调试模式。
1.1 开发者模式
首先要做手机上开启开发者模式,然后在开发者模式中打开“USB调试”开关,有些设备上还要开启“USB安装”、“USB调试”等开关,这要看具体的手机设备系统。
此时使用电脑连接手机时,会弹出USB调试授权弹框,点击确定即可。
关于如何打开“开发者模式”,不同的手机有不同的方式,可以在网上搜索。
1.1 连接已运行的进程
当设备连接到电脑后,在Android Studio的工具栏就可以看到已连接的设备了。
点击右侧这个按钮“Attach Debugger to Android Process”,弹出进程选择弹框。
选择进程并点击确认按钮,即可进入调试模式。
1.2 运行并连接
点击这个“Debug ‘app’”按钮,可以安装完应用后立即进入调试模式。
1.3 启动时连接
有时我们希望调试已安装应用的启动过程,但是使用“Debug 'app'”按钮会重新编译安装,这样会很慢且覆盖掉现有的应用,此时可以在手机上设定“选择调试应用”,并打开“等待调试器”:
这时在打开“Test”应用(已选择调试的应用),就会弹出等待调试对话框
1.4 连接非主进程
一次调试连接过程只能对一个进程进行调试,如果要调试非主进程,需要在选择调试进程界面选择期望的进程。
2. 断点
2.1 断点简介
在代码区左侧点击即可添加断点
当代码执行到断点处会暂停
断点状态下,可以在Variables窗口(图中右下侧窗口)查看当前环境下的变量信息,同时也可以修改变量的内容。
点击Evaluate Expression...按钮,弹出表达式计算弹框,在这里可以执行任何语句或查看任何变量的内容。
2.2 条件断点
在断点上点击弹出断点菜单,勾选“Condition”后,可以在下面的框中输入任意条件语句,只有当此处的条件为true的时候才会触发断点。
2.3 非中断断点
在图2-5中取消勾选“Suspend”选项,断点就变成了非中断断点。顾名思义,非中断断点并不会中断程序的执行。
勾选“Evaluate and log”并在下面的输入框中输入任意语句,在代码运行到这个位置的时候就会执行该语句。一般情况下可以输出log或者改变某个变量的值。
如果输出log,可以在调试模式的Console窗口中看到输出
2.4 变量&方法断点
可以在变量和方法上添加断点,代码将在变量改变(或访问时,可在断点菜单中设置)和方法调用(进入或退出,可设置)时中断,当然也可以执行指定的语句。
值得注意的时,在方法上添加断点会导致程序运行异常缓慢。
2.5 异常断点
点击Debug菜单中的“View Breakpoints...”按钮(如图2-8),弹出断点管理页面。勾选“Java Exception Breakpoints”,应用中任意代码崩溃时都会触发断点。
在图2-8中还能够看到添加的所有断点并进行管理。
2.5 多线程断点
一个线程只能被一个断点阻塞,所以不存在在多个断点间切换的问题。
如果在不同的线程都打了断点,且都处于阻塞中,那如何切换不同的阻塞线程呢?
在Frames页面点击顶部的下拉框,下拉部分展示了当前的线程信息,其中包含了正在查看的阻塞线程(红色对勾项)和其他正被断点阻塞的线程(红点项),选择其他线程并点击,则可以切换查看阻塞的其他线程。
2.6 屏蔽所有断点
点击Mute Breakpoints 按钮可以快速屏蔽所有断点,这避免了删除辛辛苦苦添加的断点。
3. 跟进调试
上图是调试界面的菜单按钮,下面从左向右依次介绍各按钮的功能。
- Show Execution Point 点击该按钮可以快速定位到正在中断的代码位置。
- Step Over 这个是单步调试,可在断点处一行一行的执行代码
- Step Into 点击这个按钮可以进入到当前行的方法内部
- Force Step Into 使用Step Info按钮无法进入到某些jdk方法中,此时可以用这个按钮
- Step Out 这个和Step Into 功能相反,会从当前正在执行的方法返回
- Drop Frame 丢弃当前帧,这会使断点回到当前方法调用前的位置。需要注意的是,虽然调用栈可以回滚,但是已经影响的变量数据并不会还原。低版本的Android Studio可能不支持这个功能,我所用的4.0.2上这个按钮是灰色的,不支持点击。
- Run to Cursor 点击这个按钮会执行到光标所在的行。
以上功能都存在快捷键,或者可以自定义快捷键。熟记并使用快捷键可以有效提高调试效率。除此之外还有其他仅提供快捷键的调试工具,可以通过查看快捷键表去了解。
4. 问题列表
4.1 上文中提到的某些窗口看不到
在Debug窗口的右上方点击这个按钮,即可打开或关不指定的窗口。
4.2 如何调试Release包?
可以参考这篇文章。
4.3 设备问题
在华为设备上,如果断点在生命周期方法上,那么几秒后应用就会崩溃从而无法继续调试。此时可以采用非中断断点,在断点处添加log或修改变量进行调试。