IDEA 断点调试技巧

文章目录

怎么开启断点调试调试界面的按钮返回断点位置步过步入步出回退断点断点跳到光标处表达式计算恢复程序停止调试查看所有断点禁用断点其他
竟然有那么多调试断点方法断点属性断点异常断点终止断点条件断点流断点多线程断点


如果文章对您有用,请关注点赞加收藏,博主会持续更新相关的专栏笔记🫡

怎么开启断点调试

随着开发的深入,越来越觉得高效的调试方法是多么的重要了,但我们一般上来就是敲一些代码,谁会去静下心来学一些看似没什么用的调试技巧呢?但这恰恰就是新手和老手之间的区别。

断点调试是很简单的,只需要点击 IDEA 上方的小虫子,启动调试即可,如下所示:

这当然不是本文的重点,只是开个头。

调试界面的按钮

先来介绍一下界面:

上面已经对对应的区域进行了标号,下面就来介绍一下。

返回断点位置

1 号按钮,这个用的不多,如果你从其他地方想要回到断点位置,就按一下即可。

步过

2 号按钮,说人话就是一行行的往下执行,不会进入方法里面。

步入

4 号按钮,可以进入我们自定义的方法,如果是其他类库的方法不会进入。

步出

5 号按钮,4 号按钮可以进入深层的方法,包括官方的源码,后者就是从对应的方法中出来。

回退断点

6 号按钮是很特殊的,如果你的代码中没有调用其他地方的方法,那么是呈灰色的,无法使用,只有进入更深层的方法,才能够使用,其实就是后悔药,我们很多时候调试时不小心按的快了点,很容易错过想看的位置,只能再次重启吗?不,使用 6 号按钮就可以了。

按这个按钮,可以再次回到调用方法之前,但对于数据库插入等操作,其实是无法回退的,这里的回退只是因为记录了栈信息才能够做到的。

但是要注意,如果你某个方法调用完毕了,你想再回去那就没有办法了。

断点跳到光标处

7 号按钮,主要是为了快速跳转到光标指向的那一行。

表达式计算

8 号按钮是计算表达式的,我们模拟从数据库获取集合,用表达式查询对应的元素。

恢复程序

9 号按钮称为 Resume Program,能够跳转到指定的断点处,我们在 10 行和第 100 行各加一个断点,需要点几下该按钮跳转到 100 行呢?答案是一次即可,第一次断点会在第10行停下,点击改按钮直接飞越 90 行到第 100 行。

停止调试

10 号按钮就是停止调试,但是注意,即便停止了调试,程序也会继续运行下去,如何想让他就在断点处停止呢?后面我会说到。

查看所有断点

11 号按钮打开又别有乾坤,基本功能如下图所示,主要是设置,查看断点信息,实用的方法我会在下面讲的:

禁用断点

12 号按钮就简单了,暂时禁用掉断点,方便程序继续执行,一般配合 Resume Program。

其他

13 号其实不是按钮,而是一块区域,这里面存放了很多变量的信息,方便我们查看。

在 watch 可以监控变量的变化,有同学说,中间的变量栏也可以看啊,但是单独拉出来,看起来更加的方便。

竟然有那么多调试断点

这里省略了普通的行断点调试,毕竟是最简单的,大家都会。

方法断点

方法断点是不是用在普通方法上的,最好的用法是在接口上使用,当我们在调试源码的时候,如果在接口上打了断点,再往下走,可以直接跳转到实现类的实现方法上,而不需要我们一个个的去找。

案例中,有一个接口 DemoInterface,它有两个实现类,让我们看下效果吧,演示如下:

注意,方法断点是一个菱形标志。

其实可以直接在接口方法上打断点,直接跳转到对应的实现方法的。

属性断点

属性断点是打在属性上的,我们无需在 getter、setter 方法上打断点,在属性上打上断点,就会出现一个小眼睛的标志,如下所示:

在眼睛上点击右键可以设置。

我们一般是通过 getter,setter 方法设值的,所以就会在这两个方法上停留。

异常断点

在线上由于空指针出现了 Bug,我们想快速定位到哪里出现了空指针,应该怎么做呢,答案就是,异常断点!演示如下:

可以看到,我们在全局打了个空指针断点,只要哪里出现了空指针,就会在那里停止,太方便了!

终止断点

前面我们说过,即便停止程序,也不会让我们后面运行的代码取消执行,那么我一定要取消执行可以吗?当然是可以的,在方法栈上点击右键,有一个 Force Return,然后再点击 Resumer Program,就可以直接终止返回了。

条件断点

我想要在某个条件满足的时候打上断点,而不想一步步的走下去,有什么办法吗?当然有,在断点处右击,在 Condition 里填入相应的条件即可,演示如下:

流断点

我们使用流的时候,很难看到中间做了什么,但其实 IDEA 就帮我们解决了,我用断点调试下面代码,给大家演示下:


// 先将偶数筛选,再去重,返回集合
List<Integer> list = new ArrayList<>(Arrays.asList(1, 3, 3, 4, 4, 4, 5, 6, 78));
List<Integer> collect = list.stream().filter(s -> s % 2 == 0).distinct().collect(Collectors.toList());

多线程断点

给大家演示两种情况,多线程下调试,定时任务下调试。

这个演示比较简单,可能有同学不以为意,你可以去尝试下,如果使用默认 All 来调试多线程程序会发生什么,可能某条线程就跑掉了,没有停留,而这种方式可以捕获到运行的所有线程。

定时任务这样调试有个好处,即便我们在调试的过程中下一个任务也到时间了,也不会执行,防止多次定时任务执行带来的干扰,我在演示前已经提前一分钟启动了程序,每隔 10 秒钟打印一次,但是由于暂停了线程的执行,多次点击 Resumer Program,发现并没有往下执行,而是再等了 10 秒钟之后执行。

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
态度是呵呵的头像 - 鹿快
评论 抢沙发

请登录后发表评论

    暂无评论内容