巧用IDEA Debug

巧用IDEA Debug

马草原 1,139 2022-10-29

巧用IDEA Debug

平时写代码对于IDEA的Debug功能大家应该是熟悉的不得了,但是你真的有去好好学学IDEA的Debug功能吗?事实上IDEA的Debug有很多扩展用法。这里给大家分享一下。

远程Debug

远程Debug顾名思义,就是在本地Debug远程的Java程序。很常见的就是公用环境(日常开发环境)调试程序。或者在联调的时候调试远程服务器、甚至是在线上出问题后切断流量后线上Debug。

这个应该很常见了,如下图新增Remote JVM Debug连接上即可 不需要额外操作。(如何启用JVM远程调试自行Google…)
remotejvmdebug


条件断点

Debug过公用开发环境的都知道,Debug的时候可能别人也在用环境都不知道Debug到谁的请求了,还有一种是Debug循环的时候,需要循环到某个元素的时候才执行断点。

这时可以使用IDEA中的条件断点功能。条件断点会在表达式的结果为true的时候被触发,可以根据需要设定断点的表达式,当表达式的结果为true时,IDEA就会触发断点。

如下图所示:
当方法内部执行到codemacaoyuan_MCY的时候才会断到

业务代码不方便演示 以下都为简单Demo演示

debugcode


暂时关闭断点

有时候需要暂时关掉断点 但是不希望取消断点(取消了一会找不到了🙄)

按住option+鼠标左键 临时关闭一个断点(MacOS)
option

临时关闭多个断点:

步骤一:
option1

步骤二:选择要关闭的反勾即可
option2

只是想临时跳过这一次请求的所有断点?

先点右边红色的 取消所有的断点 然后再点左边绿色的即可
option3


单次断点

有些情况下,我们希望这个断点只生效1次,那我们就可以设置单次断点。
设置的方法是先打开Breakpoints,找到你的断点,然后勾选上Remove once hit就好。

oncehit


异常断点

你是否曾经遇到过这种情况:当程序运行后,抛出空指针异常或其他任何异常,而当前堆栈信息不足以判断是哪一行出问题了。
通常我们会采取传统的方法,在方法开头设置断点,然后一步步跟进,看看在哪一步就会出错,或者直接观察上一个调用栈中的异常StackTrace,但是对于长方法来说,这种方法会耗费大量时间,还需要不断地重复触发。
异常断点便应运而生,它不是在某一行设置断点,而是在某一种异常上设置断点,当方法运行后,IDEA 会帮助你停留在造成异常的代码上,这样就可以大大提高Debug的效率了。

设置异常断点的方法是,先打开Breakpoints,点击左上角的+,选择到Java Exception Breakpoints,然后搜索想断点的JDK异常,也可以选择到Project里选择自定义异常的类。

ExceptionDebug1

这里我添加了一个空指针异常,在name为null的时候调用trim()方法发生异常后IDEA会自动帮我们断在发生异常的代码上。(当然作为程序员避免NPE是最基本的职业素养🤦🏻‍)
ExceptionDebug2


强制返回

我们平时使用Debug排查到问题代码时,代码之后有进行一些数据库资源操作或缓存操作等耗时较久的操作,如果我们不想让这个方法继续执行下去。这时候,我们就可以使用IDEA中Force Return功能强制返回。

Return


抛出异常

当我们想要验证异常处理代码的时候,希望可以通过不修改代码或合法参数的方式抛出我们想要的异常,来验证异常处理的结果,这时候可以用IDEA提供的Throw Exception功能来给当前调用栈制造异常

Exception


回退栈帧

在Debug过程中,有时候在一步步往下走的时候,F8按快了多走了一步,导致关键的一行没有被停止到,这时候我们只能重来一次,但是有些接口他的参数是一次性的(比如我们金融支付的参数🙄),重来一次的代价是比较大的,有没有办法后退一步呢?当然并没有完整的上一步的功能,但是使用drop frame,可以让某个子方法重新走一遍,一定程度上起到了上一步的作用。

回退栈帧:
reset

运行结果:
栈帧回退后重新进入了子方法,第一行被执行了两次…
reset1