IDEA 调试技巧
本文最后更新于:2020年12月30日 下午
背景
IDEA 最强大的功能之一就是 Debug 了,然而如此强大的工具却有很多人在使用了很久之后依旧只会使用断点,然后一步步的走下来,这里便稍微讲解一下 IDEA 的调试功能。
基本
启动调试
最简单直观的就是点击工具栏的 Debug 按钮(S-F9
)即可开始调试当前运行选项,然后便会弹出 Debug 选项卡(A-5
)。
启动调试有三种情况:
S-F9
如果运行选项不为空,调试当前运行选项CS-F9
如果当前文件可以运行的话,就调试当前文件SA-F9/F9
显示所有可以调试的运行选项
注:F9
只有在非调试环境下生效,在调试环境下的作用是运行到下一个断点。
断点
在左侧边栏上点击一下(亦或是 A-F8
添加一个?)就可以为当前可以运行到的代码行添加一个红色的小圆点(断点),当代码运行到断点时会自动停下(并自动跳转过来),然后我们就可以自己的查看运行时的细节了。
注:我们不能为不可能运行到的位置添加断点。例如以下情况:
- 方法右侧大括号单独所在的行(会报错但仍能添加),错误:
No executable code found at line
- 类的方法之间的空行,这些地方甚至不能打断点(因为毫无意义!)
移动
F7
:跳转到方法内部S-F7
:选择跳转到哪个方法内部F8
:执行到下一行代码,如果没有下一行代码,则跳转到调用者方法(非类库的)。S-F8
:跳转到方法的调用者处,即便代码是类库里面的。F9
:让程序恢复到运行状态(未遇到断点的情况下),想跳到下一个断点或者让程序恢复正常运行状态就用这个吧A-F9
:跳转到当前行,主要用于在想进入方法内部看看时(一般很多人习惯打个断点吧?)
忽略所有断点
有这么一种情况,我们想要正常运行看一下效果,又不想重启服务器(一会有错误还要调试呢),就可以使用这个功能避免我们无谓的进入断点。
功能的名字是 Mute Breakpoints
,但默认没有快捷键。可以使用结构查询 CS-A
输入这个名字进行查找,或者在调试选项卡中找到它点击一下就可以了。
执行表达式
IDEA 调试非常棒的一个功能,有时候想看看某个表达式的值,但又不想真正执行它(例如调用有可能因为参数报错的方法),想先看一下结果,这里就可以使用执行表达式(A-F8
)这个功能了。
IDEA 能够自动感知当前调试的环境(例如当前调试代码行能访问到的所有变量执行表达式窗口中都能访问,反之亦然),也能在弹窗中自动提示代码。
但请注意,执行表达式中执行的代码是真的执行了,所以例如只能读取一次的流,数据库,文件等等,都是真正被改变的了,所以需要稍微注意一下哦
变量监视
上面的执行表达式可以查看表达式的值,然而如果我们想要看一个表达式的值在代码运行过程中发生了什么变化怎么办?难道每运行一行代码就使用执行表达式查看一下表达式的值么?那效率也太低了!
所以这里就需要用到变量监视这个功能了(Add to Watches
),既可以右键将表达式的值添加到监视变量中,也能够在执行表达式窗口直接将当前表达式的值添加到监视变量中去(CS-Enter
)。每一次代码走到下一步都会自动刷新值(其实就是执行了一次)。
高级
条件断点
可以给一个断点添加一个条件,指定在什么情况下会停留到这个断点(例如 if 语句里面的判断表达式为 true
时就停留),但断点条件只能是 true/false
。操作的话在断点代码行使用 CS-F8
或者直接右键单击断点,就会弹出一个窗口,在 Condition
部分输入需要的条件就可以啦
断点管理
断点太多了怎么办?调试的时候想要测试某个请求的时候总是进入不相关的断点,这里可以使用断点管理功能。放在任意一个非断点代码行的位置按下 CS-F8
就会弹出一个断点管理弹窗,里面列出了所有,你可以在这里对断点进行更加细致的管理(启用/禁用/添加/删除/是否是多线程都有效/条件表达式/执行日志/相关代码修改/双击断点则后面的选项跳转到断点处)。
异常断点
有一种情况是我们在控制台看到了异常,但很想知道会在什么地方发生某个指定的异常。这时候就可以使用这个功能了。这个功能依赖于断点管理,需要在断点管理弹窗中进行添加断点异常(A-Ins
)才可以。以后当每次发生指定异常时,都会停留在相应的代码处,以便于查看更加详细的原因。
代码回退
跳跃到上一个方法调用链处,或者在 Frames
选项卡中右键 Drop Frame
选择调用链的位置,然后回到这个位置。感觉上就像是回退一样,但其实并没有这么神奇。该功能只能回退到以前的方法调用位置,而且回退后 未来 的记录会被删除,总而言之这也是 IDEA 提供的一个调试的功能之一呢(吾辈个人用的不是很多)
强制返回
有时执行某个方法时已经发生了错误(例如参数有问题),但又不想继续执行下去(发生异常),所以就可以直接中断指定方法,强制返回指定的值。在方法调用链选项卡中选择一处(一般是当前方法),右键选择 Force Return
就可以强制结束该方法并返回指定的值了。
模拟抛出异常
场景:在需要测试方法在非正常执行时(例如测试数据库关闭发生数据库连接错误时的情况),如果还在手动添加测试异常代码就有点落后了,IDEA 已经为我们提供了优秀的工具!使用方法也很简单,就是在方法调用链选项卡指定位置右键选择 Throw Exception
。