点击上方“Java基基”,选择“设为星标”
做积极的人,而不是积极废人!
每天 14:00 更新文章,每天掉亿点点头发...
源码精品专栏
来源:blog.csdn.net/weixin_44353507/
一. 怎么开启断点调试?
随着开发的深入,越来越觉得高效的调试方法是多么的重要了,但我们一般上来就是敲一些代码,谁会去静下心来学一些看似没什么用的调试技巧呢?但这恰恰就是新手和老手之间的区别。
断点调试是很简单的,只需要点击idea上方的小虫子,启动调试即可,如下所示。
![9a9a420f838ba788f7a16943b1cc5d6b.png](https://img-blog.csdnimg.cn/img_convert/9a9a420f838ba788f7a16943b1cc5d6b.png)
这当然不是本文的重点,只是开个头。
基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
项目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro
视频教程:https://doc.iocoder.cn/video/
二. 调试界面咋那么多按钮?
先来介绍一下界面。
我给这些区域都标了号,下面来重点介绍。
1.返回断点位置
1号按钮,这个用的不多,如果你从其他地方想要回到断点位置,就按一下即可,如下GIF所示。
![5be7d4059706c6012348770fd9874027.gif](https://img-blog.csdnimg.cn/img_convert/5be7d4059706c6012348770fd9874027.gif)
2.步过
2号按钮,说人话就是一行行的往下执行,不会进入方法里面,如下所示。
![e3ccd43382c0675d876d6929e167a90f.gif](https://img-blog.csdnimg.cn/img_convert/e3ccd43382c0675d876d6929e167a90f.gif)
3.步入
3号按钮,可以进入我们自定义的方法,如果是其他类库的方法不会进入,如下所示。
![821ae27c8907de78ff802077da9d9e5c.gif](https://img-blog.csdnimg.cn/img_convert/821ae27c8907de78ff802077da9d9e5c.gif)
4、5.强制步入,步出
4号5号按钮,前者可以进入深层的方法,包括官方的源码,后者就是从对应的方法中出来,演示如下。
![053491c5b3282572324a9e41a97c3c52.gif](https://img-blog.csdnimg.cn/img_convert/053491c5b3282572324a9e41a97c3c52.gif)
6.回退断点
6号按钮是很特殊的,如果你的代码中没有调用其他地方的方法,那么是呈灰色的,无法使用,只有进入更深层的方法,才能够使用,其实就是后悔药,我们很多时候调试时不小心按的快了点,很容易错过想看的位置,只能再次重启吗?不,使用这个drop frame 就可以了,演示如下。
可以看到,这里往下执行了add,但是还没有执行完,按这个按钮,再次回到了调用方法之前,但对于数据库插入等操作,其实是无法回退的,这里的回退只是因为记录了栈信息才能够做到的。
![8ba6e3e347491f1d1c84ef145fc0af54.gif](https://img-blog.csdnimg.cn/img_convert/8ba6e3e347491f1d1c84ef145fc0af54.gif)
但是要注意,如果你某个方法调用完毕了,你想再回去那就没有办法了。
7.断点跳到光标处
7号按钮也用的不多,主要是为了快速跳转到光标指向的那一行,如下所示。
![9851419cf6123a3754529cc5738da112.gif](https://img-blog.csdnimg.cn/img_convert/9851419cf6123a3754529cc5738da112.gif)
8.表达式计算
8号按钮是计算表达式的,我们模拟从数据库获取集合,用表达式查询对应的元素,如下所示。
![89b3adc6cf2b3f27ba10eb2488f23669.gif](https://img-blog.csdnimg.cn/img_convert/89b3adc6cf2b3f27ba10eb2488f23669.gif)
9.恢复程序
9号按钮称为 Resume Program
,能够跳转到指定的断点处,我们在10行和第100行各加一个断点,需要点几下该按钮跳转到100行呢?答案是一次即可,第一次断点会在第10行停下,点击改按钮直接飞越90行到第100行,如下所示。
![8bff18dbcb2b0f072b90d5a1c6a6e7c1.gif](https://img-blog.csdnimg.cn/img_convert/8bff18dbcb2b0f072b90d5a1c6a6e7c1.gif)
10.停止程序
10号按钮就是停止调试,但是注意,即便停止了调试,程序也会继续运行下去,如何想让他就在断点处停止呢?后面我会说到。
11.查看所有断点
11号按钮打开又别有乾坤,基本功能如下图所示,主要是设置,查看断点信息,大家看着应吧,实用的方法我会在下面讲的。
![e7050288d8e76ed1e1ff31f2aff93293.png](https://img-blog.csdnimg.cn/img_convert/e7050288d8e76ed1e1ff31f2aff93293.png)
12.禁用断点
12号按钮就简单了,暂时禁用掉断点,方便程序继续执行,一般配合 Resume Program
。
13.其他
13号其实不是按钮,而是一块区域,这里面存放了很多变量的信息,方便我们查看。
14号按钮其实之前被我忽略掉了,这次拿出来讲一下,在watch可以监控变量的变化,有同学说,中间的变量栏也可以看啊,但是单独拉出来,看起来更加的方便,演示如下。
![54246d8b581d603eadd810207b4a84d9.gif](https://img-blog.csdnimg.cn/img_convert/54246d8b581d603eadd810207b4a84d9.gif)
基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
项目地址:https://gitee.com/zhijiantianya/yudao-cloud
视频教程:https://doc.iocoder.cn/video/
三. 竟然有那么多调试断点?
这里省略了普通的行断点调试,毕竟是最简单的,大家都会。
1.方法断点
方法断点是不是用在普通方法上的,最好的用法是在接口上使用,当我们在调试源码的时候,如果在接口上打了断点,再往下走,可以直接跳转到实现类的实现方法上,而不需要我们一个个的去找。
案例中,有一个接口DemoInterface
,它有两个实现类,让我们看下效果吧,演示如下。
![c5d57d7d222f326f7c42621a036bca7d.png](https://img-blog.csdnimg.cn/img_convert/c5d57d7d222f326f7c42621a036bca7d.png)
注意,方法断点是一个菱形标志。
![8abe649e048b506542235e6988e1d916.gif](https://img-blog.csdnimg.cn/img_convert/8abe649e048b506542235e6988e1d916.gif)
其实可以直接在接口方法上打断点,直接跳转到对应的实现方法的,这里是为了放慢演示速度。
2.属性断点
属性断点是打在属性上的,我们无需再getter setter
方法上打断点,在属性上打上断点,就会出现一个小眼睛的标志,如下所示。
![c4568e67cb983e6728af4bd28231e343.png](https://img-blog.csdnimg.cn/img_convert/c4568e67cb983e6728af4bd28231e343.png)
在眼睛上点击右键可以设置。
我们一般是通过getter,setter方法设值的,所以就会在这两个方法上停留。
![bfc6f97f43dcd8b81fa00d280c79dc1f.png](https://img-blog.csdnimg.cn/img_convert/bfc6f97f43dcd8b81fa00d280c79dc1f.png)
看一下GIF演示吧。
![4850246de2642d597352230fa432c546.gif](https://img-blog.csdnimg.cn/img_convert/4850246de2642d597352230fa432c546.gif)
3.异常断点
在线上由于空指针出现了BUG,我们想快速定位到哪里出现了空指针,应该怎么做呢,答案就是,异常断点!演示如下。
![713569d07d566b6bccee5a6a6c0dc595.png](https://img-blog.csdnimg.cn/img_convert/713569d07d566b6bccee5a6a6c0dc595.png)
注意,异常断点是一个闪电的标志。
![16686167d4e4f9f63f9ad903f55af2c5.gif](https://img-blog.csdnimg.cn/img_convert/16686167d4e4f9f63f9ad903f55af2c5.gif)
可以看到,我们在全局打了个空指针断点,只要哪里出现了空指针,就会在那里停止,太方便了!
4.终止断点
前面我们说过,即便停止程序,也不会让我们后面运行的代码取消执行,那么我一定要取消执行可以吗?当然是可以的,演示如,在方法栈上点击右键,有一个Force Return
,然后再点击Resumer Program
,就可以直接终止返回了。
![8246750700631c0425a7ca44eb625452.gif](https://img-blog.csdnimg.cn/img_convert/8246750700631c0425a7ca44eb625452.gif)
5.条件断点
我想要在某个条件满足的时候打上断点,而不想一步步的走下去,有什么办法吗?当然有,在断点处右击,在condition
里填入相应的条件即可,演示如下。
![232c2bbc7ff24855224831ad09faaa7e.gif](https://img-blog.csdnimg.cn/img_convert/232c2bbc7ff24855224831ad09faaa7e.gif)
6.流断点
我们使用流的时候,很难看到中间做了什么,但其实idea就帮我们解决了,我用断点调试下面代码,给大家演示下。
其实只需要找到这个按钮就行了
![d7634d91508ae1220f83f6ce9221a310.png](https://img-blog.csdnimg.cn/img_convert/d7634d91508ae1220f83f6ce9221a310.png)
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());
![90b1d1d3e2d956baf01a81d2b37fb324.gif](https://img-blog.csdnimg.cn/img_convert/90b1d1d3e2d956baf01a81d2b37fb324.gif)
7.多线程断点
给大家演示两种情况,多线程下调试,定时任务下调试。
这个演示比较简单,可能有同学不以为意,你可以去尝试下,如果使用默认All来调试多线程程序会发生什么,可能某条线程就跑掉了,没有停留,而这种方式可以捕获到运行的所有线程。
定时任务这样调试有个好处,即便我们在调试的过程中下一个任务也到时间了,也不会执行,防止多次定时任务执行带来的干扰,我在演示前已经提前一分钟启动了程序,每隔10秒钟打印一次,但是由于暂停了线程的执行,多次点击
Resumer Program
,发现并没有往下执行哦,而是再等了10秒钟之后执行。
![3e837cc2950c3cdf10425af9c9bafaf1.gif](https://img-blog.csdnimg.cn/img_convert/3e837cc2950c3cdf10425af9c9bafaf1.gif)
8.远程断点
这个忽略啦,因为确实没有远程打过断点,有时间再补充吧,个人感觉可有可无。
欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:
已在知识星球更新源码解析如下:
最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。
提供近 3W 行代码的 SpringBoot 示例,以及超 6W 行代码的电商微服务项目。
获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。
文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)