1)基本的调试流程
一般的调试流程图如下所示:(核心就是下断点,单步调试,值跟踪)
2)下断点
先说说断点,不是张敬轩的《断点》,调试时的断点的作用是:
当程序执行到断点所在的代码时,会暂停应用程序的运行,线程被挂起,然后 可以通过调试器进行跟踪。
下断点的方式也很简单,点击某行代码的左侧,会出现如图所示的小红点。
这个小红点就是断点,而在AS中,又有着多种类型的断点,带你们过一遍吧:
① 行断点
就是上面这种,对特定行进行调试时用到,点击行所在的左侧边栏即可设置。 右键点击这个断点,会弹出如下所示的设置对话框:
如果你取消了Enabled勾选,断点就处于如图所示的禁用状态:
② 方法断点
如果你把断点下到一个方法前,断点就会变成这样:
这个就是方法断点,一般用来检查方法的「输入参数」与「返回值」。
③ 变量断点
有时我们对程序运行过程并不关心,而只关注某个变量的变化,可以在变量定义前加一个断点。
在程序运行过程中,如果该变量的值发生改变,程序会自动停下来,并定位到变量值改变的地方,供开发者调试。
另外,右键还可以设置断点,Watch面板有两个特有的选项,可按需勾选:
- Field access:字段被访问时触发断点。
- Field modification:字段被修改时触发断点。
④ 条件断点(断点设置Condition)
有时会有这样的场景:把断点打到循环体的中,我们只关心特定循环次数下的运行情况。 比如一个循环10次的循环体,我们想知道循环到第8次时的运行情况,如果你不知道 条件断点的话,你需要一直按「Run to Cursor」直到满足我们的条件。比如下面的代码:
我们想知道当i = 8的时候,sum为多少,你需要一直按「Run to Cursor」
按7次,直到i = 9位置,如果用条件断点,当循环体执行到某个条件才停下来,右键断点,输入如图所示的等式条件:
然后可以发现,程序直接跳到i=8的时候才挂起,非常方便。
⑤ 日志断点
调试的时候我们可以通过打印日志的方式来定位异常代码大概位置,以缩小引发问题的范围,然后 再使用断点精确定位问题。如果是普通的打印日志,我们需要等待重新构建程序,如果用「日志断点」 就避免这个无意义的等待。使用日志断点非常简单,右键断点,去掉「Suspend」的勾选,会出现 如下所示的弹窗,勾选「Evaluate and log」在此输入想输出的内容。
运行调试后,当执行到日志断点的时候可以看到控制台输出了对应的日志信息,而且程序正常运行,并不会挂起。
如果想查看更详细的信息,比如断点的位置和触发时的堆栈信息,可以勾选
「"Breakpint hit" message」和「Stacktrace」,勾选后输出内容会变得更详细:
⑥ 临时断点
所谓的临时断点就是:触发一次后就自动删除的断点。设置的方法有两种:
- 1.光标移到想打点的行,点击菜单栏「Run」->「Toggle Temporary Line Breakpoint」,
等价于快捷键:「Ctrl+Alt+Shift+F8」
- 2.更便捷的操作:按住Alt,鼠标点击左侧边栏。
鼠标点击后可以去掉临时断点,如果想把临时断点变成普通断点,可以取消勾选 「Remove once hit」的选项。
⑦ 异常断点
用于监听程序异常,一旦程序奔溃,直接定位到异常所在的确切位置。依次点击: 「Run」->「View Breakpoints」打开断点视图。点击「+」,然后选择 「Java Exception Breakpoints」,在弹出的窗口中输入要调试的异常:
除了设置异常断点外,你在这里看到项目设置的所有断点,并进行断点管理与配置。 另外,你还可以设置自定义异常断点,点击「4.Exception Breakpoints」自行配置即可。