巧用IDEA Debug
平时写代码对于IDEA的Debug功能大家应该是熟悉的不得了,但是你真的有去好好学学IDEA的Debug功能吗?事实上IDEA的Debug有很多扩展用法。这里给大家分享一下。
远程Debug
远程Debug顾名思义,就是在本地Debug远程的Java程序。很常见的就是公用环境(日常开发环境)调试程序。或者在联调的时候调试远程服务器、甚至是在线上出问题后切断流量后线上Debug。
这个应该很常见了,如下图新增Remote JVM Debug
连接上即可 不需要额外操作。(如何启用JVM远程调试自行Google…)
条件断点
Debug过公用开发环境的都知道,Debug的时候可能别人也在用环境都不知道Debug到谁的请求了,还有一种是Debug循环的时候,需要循环到某个元素的时候才执行断点。
这时可以使用IDEA中的条件断点功能。条件断点会在表达式的结果为true
的时候被触发,可以根据需要设定断点的表达式,当表达式的结果为true时
,IDEA就会触发断点。
如下图所示:
当方法内部执行到code
为macaoyuan_MCY
的时候才会断到
业务代码不方便演示 以下都为简单Demo演示
暂时关闭断点
有时候需要暂时关掉断点 但是不希望取消断点(取消了一会找不到了🙄)
按住option
+鼠标左键 临时关闭一个断点(MacOS)
临时关闭多个断点:
步骤一:
步骤二:选择要关闭的反勾即可
只是想临时跳过这一次请求的所有断点?
先点右边红色的 取消所有的断点 然后再点左边绿色的即可
单次断点
有些情况下,我们希望这个断点只生效1次,那我们就可以设置单次断点。
设置的方法是先打开Breakpoints
,找到你的断点,然后勾选上Remove once hit
就好。
异常断点
你是否曾经遇到过这种情况:当程序运行后,抛出空指针异常或其他任何异常,而当前堆栈信息不足以判断是哪一行出问题了。
通常我们会采取传统的方法,在方法开头设置断点,然后一步步跟进,看看在哪一步就会出错,或者直接观察上一个调用栈中的异常StackTrace
,但是对于长方法来说,这种方法会耗费大量时间,还需要不断地重复触发。
异常断点便应运而生,它不是在某一行设置断点,而是在某一种异常上设置断点,当方法运行后,IDEA 会帮助你停留在造成异常的代码上,这样就可以大大提高Debug的效率了。
设置异常断点的方法是,先打开Breakpoints
,点击左上角的+
,选择到Java Exception Breakpoints
,然后搜索想断点的JDK异常,也可以选择到Project
里选择自定义异常的类。
这里我添加了一个空指针异常,在name为null的时候调用trim()
方法发生异常后IDEA会自动帮我们断在发生异常的代码上。(当然作为程序员避免NPE是最基本的职业素养🤦🏻)
强制返回
我们平时使用Debug排查到问题代码时,代码之后有进行一些数据库资源操作或缓存操作等耗时较久的操作,如果我们不想让这个方法继续执行下去。这时候,我们就可以使用IDEA中Force Return
功能强制返回。
抛出异常
当我们想要验证异常处理代码的时候,希望可以通过不修改代码或合法参数的方式抛出我们想要的异常,来验证异常处理的结果,这时候可以用IDEA提供的Throw Exception
功能来给当前调用栈制造异常。
回退栈帧
在Debug过程中,有时候在一步步往下走的时候,F8按快了多走了一步,导致关键的一行没有被停止到,这时候我们只能重来一次,但是有些接口他的参数是一次性的(比如我们金融支付的参数🙄),重来一次的代价是比较大的,有没有办法后退一步呢?当然并没有完整的上一步的功能,但是使用drop frame
,可以让某个子方法重新走一遍,一定程度上起到了上一步的作用。
回退栈帧:
运行结果:
栈帧回退后重新进入了子方法,第一行被执行了两次…