做开发者几年,多数的情况下是在用打log这种方式进行调试应用:一来长期使用以来的习惯,二来是公司安装的as,运行debug出各种错误,卸载安装都不好使;但前一段时间需要调试一段代码,通过打log的方式,费时又费力,很简单的错误硬是搞了好久,严重影响进度,所以下心思准备再次好好搞一下debug调试,但使用debug的方法几乎忘得差不多了,于是周末花点时间捡起来,并做个记录。
先来看看打开debug的两种方式(如下图):
注:运行该方法有可能会报一个错误(一直停留在waiting for debugger)
解决方案:
- 判断是否打开多个模拟器或as,全部关掉,只留下一个as和要运行的机器;
- 查看adb端口是否被360手机助手占用,如果有则关闭;
- 重启adb;
- 以上方法都不好使,就换一个设备(我的红米3s一直进不去,结果使用模拟器调试)
方法2:和debug方式相比,能够将调试器attach到任何正在运行的进程(没用过,方式1就可以解决大多数问题)。
Debug界面:基本分为6个功能区
- 调试功能区
- 断点管理区
- 线程栈帧区
- 对象变量区
- 变量观察区
- 求值表达式
功能调试区
-
Show Execution Point:点击该按钮,光标将定位到当前正在调试的位置。
-
Step Over(快捷键F8):单步跳过,点击该按钮将导致程序向下执行一行,如果当前行是一个方法调用,则获取方法结果并执行下一行,不会进入方法内部。
-
Step Into(快捷键F7):单步跳入,和Step Over类似,但如果该行的方法是自定义方法,则进入方法内部执行,如果是类库中的方法,则不会进入。
-
Force Step Info:强制单步跳入,和Step Info类似,区别在于会进入方法的内部,不管该方法是自定义或类库中方法。
-
Drop Frame:中断执行,并返回到方法执行的初始点,在这个过程中该方法对应的帧栈会从栈中移除,例如如果是方法被调用 则返回该方法被调用处,且所有上下文变量的值也恢复到执行时的状态。
-
Force Run to Cursor:忽略所有的断点,跳转到当前光标所在的位置进行调试,在光标之前的断点都被忽略。
-
Evaluate expression:点击该按钮会在当前调试的语句处嵌入一个交互式解释器,在该解释器中,可执行表达式进行求值操作。
断点管理区
-
Return:点击该按钮会停止当前应用并重新启动(不知道为什么我的as上没有这个按钮)。
-
Resume Program(快捷键F9):跳转到下一个断点处,如果没有断点则运行停止。
-
Stop:停止调试,结束运行。
-
View BreakPoints(Run --> View BreakPoints):该按钮用来禁止/启动所有断点。
变量观察区(用于观察某个变量的值)
-
添加到观察区:
-
设置变量的值:选中变量,右键选中set Value,弹出输入框,修改变量值后回车即可:
线程帧栈区:用于查看线程运行状态
断点的分类
-
条件断点:
-
日志断点:右键断点,勾选Log message to console 和 Evluate and log,可以在断点上设置日志,并在控制台输出。
-
异常断点:在运行到异常时,控制异常程序停止到抛出异常那一刻。
-
方法断点:可以通过单步调试,查看方法的参数和返回值。
- 属性断点:通过添加到watches,查看每次属性的变化,如同观察变量区。