前言

上一篇文章 IntelliJ IDEA 高级调试之Stream Trace 算是 IntelliJ IDEA 高级调试技巧的开胃菜,小伙伴们被这个小技巧驯服,趁热打铁,明天给大家带来几个大家日常工作以及浏览源码必备的高级调试技巧

断点处增加 log

很多程序员在调试代码时都喜爱 print 一些内容,这样看起来更直观,print 完之后又很容易遗记删除掉这些没用的内容,最终将代码提交到 remotecode review 时又不得不删减这些内容从新提交,岂但减少不必要的工作量,还让 log tree 的一些节点没有任何价值

IntelliJ IDEA 提供 Evaluate and Log at Breakpoints 性能凑巧能够帮忙咱们解决这个问题, 来看上面代码:

public static void main(String[] args) {        ThreadLocalRandom random = ThreadLocalRandom.current();        int count = 0;        for (int i = 0; i < 5; i++) {            if (isInterested(random.nextInt(10))) {                count++;            }        }        System.out.printf("Found %d interested values%n", count);    }    private static boolean isInterested(int i) {        return i % 2 == 0;    }

如果咱们想在第 15 行查看每次调用,随即进去的 i 的值到底是多少,咱们没必要在这个中央增加任何 log,在失常加断点的中央应用快捷键 Shift + 鼠标左键,就会弹出上面的内容

勾选上 Evaluate and log, 并自定义你想查看的 log/变量,比方这里的 "interested" + i, 这样以 Debug 模式运行程序(失常模式运行,不会打印这些 log):

interested 7interested 5interested 1interested 2interested 0Found 2 interested values

如果你在多处增加了这种断点,简略的看 log 可能偶然还是不够直观,能够勾选下面图片绿色框线的 "Breakpoint hit" message :

Breakpoint reached at top.dayarch.TestDebug.isInterested(TestDebug.java:49)interested 6Breakpoint reached at top.dayarch.TestDebug.isInterested(TestDebug.java:49)interested 0Breakpoint reached at top.dayarch.TestDebug.isInterested(TestDebug.java:49)interested 9Breakpoint reached at top.dayarch.TestDebug.isInterested(TestDebug.java:49)interested 8Breakpoint reached at top.dayarch.TestDebug.isInterested(TestDebug.java:49)interested 1Found 3 interested valuesDisconnected from the target VM, address: '127.0.0.1:0', transport: 'socket'Process finished with exit code 

如果你想要更具体的信息,那就勾选上 Stack trace (大家本人查看运行后果吧),有了这个性能,下面说的一些问题都不复存在了

字段断点

如果你浏览源码,你肯定会有个困扰,类中的某个字段的值到底是在哪里扭转的,你要一点点追踪调用栈,逐渐排查,稍不留神,就可能有脱漏

咱们能够在 IntelliJ IDEA 中为某个字段增加断点,当字段值有批改时,主动跳到相应办法地位

应用起来很简略:

  1. 在字段定义处鼠标左键增加断点(会呈现「眼睛」的图标)
  2. 在「眼睛」图标上鼠标右键
  3. 在弹框中勾选上 Field accessField modification 两个选项

如果批改字段值的办法比拟多,也能够在 Condition 的中央定义断点进入条件, 有了这个性能的加成,置信你浏览源码会顺畅许多

异样断点

除了浏览源码,肯定是遇到了异样咱们才开始调试代码,代码在抛出异样之后会主动进行,然而咱们心愿:

代码停在抛出异样之前,不便咱们查看过后的变量信息

这时咱们就用到了 Exception Breakpoints, 当抛出异样时,在 catch 的中央打上断点,能够通过下图的几个地位获取栈顶异样类型,比方这里的 NumberFormatException

晓得异样类型后,就能够依照如下步骤增加异样断点了:

而后在弹框中抉择 NumberFormatException

从新以 Debug 模式运行程序:

程序「一路绿灯式」定位到抛出异样的地位,同时指出过后的变量信息,三个字:稳,准,狠,还有谁?

办法断点

当浏览源码时,比方 Spring,一个接口的办法可能被多个子类实现,当运行时,须要查看调用栈逐渐定位实现类,IDEA 同样反对在接口办法上增加断点(快捷键 cmd+F8/ctrl+F8):

  1. 鼠标左键在办法处点击断点(♦️形态)
  2. 断点上鼠标右键

勾选上绿色框线上的内容,同样能够自定义跳转条件 Condition

当以 Debug 模式运行程序的时候,会主动进入实现类的办法(留神断点形态):

看到这你应该想到常见的 Runnable 接口中的 run 办法了,同样是有作用的,大家能够自行去尝试了

总结

置信有以上四种调试技巧的加成,无论是工作debug 还是私下浏览源码,都能够轻松驾驭了。最初,来看看 IDEA 反对的各种断点调试类型,如果你只晓得红色小圆点,那咱在留言区好好说说吧

日拱一兵 | 原创