Idea Debugger技巧分享

145 阅读5分钟

对于服务端而言,Idea的Debugger几乎成为了调试代码的银弹。但是,很多人在使用Debugger时,只使用了其中很小一部分功能。

本文将简要介绍一些Idea Debugger中一些鲜为人知,却能够在特定场景提升Debug效率的功能。

  1. 断点

  1. 字段观察

功能:当指定的字段被读取或写入时暂停程序

如果只用行断点的话,需要找到字段可能被使用或修改的每一行进行断点,而设置了字段观察点可以不用关心哪些行会修改字段,当它被使用或修改的时候自然会停下来。

  1. 静音断点

功能:在调试的时候可能不需要运行后面的断点了,这个时候使用静音断点,就可以将所有断点静音,然后正常运行完整个流程查看输出的结果

  1. 异常断点

功能:可以在抛出异常的地方进行暂停

异常断点是无需在具体的代码上打断点的,而是在断点详情页中直接添加,后续在执行时,如果抛出我们监听的异常,则会自动暂停在抛出异常的地方。

  1. 主动抛异常

功能:主动抛出指定异常

如果我们想在远程环境抛出一个异常,需要修改代码重新部署,测试完后还要修改回来再次部署。而 Throw Exception 则可以直接抛出一个异常,避免了这些繁琐的流程。

  1. 降帧

功能:当我们 Debug 从 A 方法进入 B 方法时,通过降帧(退帧)可以返回到调用 B 方法前,这样我们就可以再一次调用 B 方法

通常用于当我们快执行完 B 方法后,发现某个重要流程被我们跳过了,想再看一下,则此时可以先回退到 A 方法,然后再次进入 B 方法。

  1. 断点条件

功能:当程序执行到断点位置时,需要 Condition 中的表达式返回 true,才会暂停,否则会直接跳过

  1. 强制返回

功能:强制结束当前程序运行流程,直接返回

当我们调试时,发现继续往下执行就要将错误的数据写入数据库时,我们可以通过 Force Return 来强行结束当前流程。

如果我们使用stop直接退出debug流程,那么程序流程还是会继续往下走。

  1. 不暂停断点

作用:当程序运行到断点时,代码不会中断执行,而是会直接在Debugger中打印出Evaluate and log中的信息

我们在创建断点时,进入断点配置界面后取消勾选Suspend,并填写Evaluate and log,此时,断点将会变为黄色。

有的时候我们想在测试和预发环境加日志,就可以用这个方法先在本地测试一下日志加的是否全面,不用重复发布代码。

  1. Stream 调试

功能:当我们暂停在 Stream 的处理代码行时,可以将 Stream 的整个处理流程以图形化界面的形式展示

我们可以通过该功能来看到每个步骤处理前和处理后的数据,方便我们定位排查是哪一步出了问题。

  1. 执行表达式

功能:用于执行一段我们实时写的代码,例如查看数据、修改数据

之前我一直以为只能查看数据,没想到还能实时修改数据,达到随心所欲mock数据的效果

  1. 依赖断点

功能:让目标断点在执行完某个断点后才启用

有时,目标方法可能被多个方法调用,例如以下代码,work()方法同时被warmup和realWork方法调用。如果我们只想在realWork方法执行的时候进行debug,那么就可以使用依赖断点功能。

  1. 渲染

  1. 修改对象渲染器

有时,IDEA自带的变量渲染器并不能满足我们的需要。例如,我们创建一个继承JSONObject的类:

由于JSONObject继承了Map,所以IDEA默认是以Map的方式渲染的,因此,当我们运行以下代码时,可以看到bizObject中的msg字段直接不见了。

这当然不是我们想要的,为了获得真实的变量结果,我们可以手动修改IDEA的渲染方式。

  1. 直接修改渲染方式

直接将渲染方式从map修改为toString。

可以看到,参数可以正常显示出来了。

  1. 创建Class Level Watch

如果我们只想看BizObject中的msg字段,又不想修改渲染器的话,可以通过创建Class Level Watch来达到这一目的。

右键变量,点击New Class Level Watch:

在弹出的输入框中输入想要查看的内容:

接下来,项目中所有类型为BizObject的类都会单独渲染一个msg字段。

  1. 修改列表渲染器

当我们创建如下的列表时:

在Debug界面,IDEA会将integers列表渲染为:

可以看到,IDEA并没有渲染为null的元素,如果我们没有注意,并在接下来遍历这个list,很可能会产生NPE。

如何让IDEA显示为null的元素呢?方法如下:

取消勾选后,IDEA就会将列表重新渲染为以下内容了。