AS之Debug调试

540 阅读3分钟

做开发者几年,多数的情况下是在用打log这种方式进行调试应用:一来长期使用以来的习惯,二来是公司安装的as,运行debug出各种错误,卸载安装都不好使;但前一段时间需要调试一段代码,通过打log的方式,费时又费力,很简单的错误硬是搞了好久,严重影响进度,所以下心思准备再次好好搞一下debug调试,但使用debug的方法几乎忘得差不多了,于是周末花点时间捡起来,并做个记录。

先来看看打开debug的两种方式(如下图):

方法1:以调试模式安装运行,断点在运行前后都可以设置

注:运行该方法有可能会报一个错误(一直停留在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,查看每次属性的变化,如同观察变量区。