前言:
最近在学习某个看起来有点复杂的框架,我想知道它的数据访问是如何发生的。所以我选择对foodCartViewRepository
进行操作的方法下断点,看看这些函数是何时被调用的。
以下的操作都是在intellij idea中完成的。
行断点和logger
一开始的时候,我选择的是很传统的行断点。
然后在我开始调试的时候,我哭了,因为我没想到这个断点一直被触发,导致程序的运行磕磕绊绊的,很是难受。
后来我想到了,使用logger来输出一些相关的对象。
这样的方式是很好的,程序运行起来的时候不会出现磕磕绊绊的,并且可以在“非调试”环境下观察程序的运行情况。
然而这样的方式好像有一个缺点,在需要观察多个函数的执行情况的时候, 需要在很多地方写很多麻烦的log代码。感觉这样好像也不是太方便。
字段断点
后面我思考了以下,我原本只想知道的是foodCartViewRepository
这个对象的执行情况。
并且,在 intellij idea中,可以设置“高级”断点。
在foodCartViewRepository
字段的行号右边点击一下,就可以创建出针对这个字段的断点(图标是一个眼睛的形状)。
当我们右击这个眼睛的时候,可以在弹窗中,对这个断点的细节进行设置。
取消勾选Suspend这个框后,可以发现眼睛变成了黄色,这表示程序不会暂停(Suspend)在这个地方,这样就不会出现磕磕绊绊的情况了。
这时读者可能会想,不能暂停的断点有啥用呢?其实就算是程序不能暂停,我们仍然可以像使用logger那样,获取一些程序的执行情况。
对刚才那个断点,我们可以进行下面的设置,这样就可以提供类似logger的功能了。
以调试模式运行程序,我们可以看到一些这个断点给我们提供的信息!
但是,我发现,程序的启动变得十分缓慢,从点击调试运行的按钮到程序完全启动,大概花了一两分钟。然而,在非调试情况下(正常模式),程序的启动只需要十秒左右。因此,开启“字段断点”后的调试启动速度让人有点“难以接受”。
综合使用断点
我发现,可以在程序刚开始运行的时候,mute所有的断点
于是,一开始程序运行的时候,这些断点是出于Muted的状态的,在我认为程序完全启动之后,我手动unmute这些断点。经过测试,程序的启动速度确实变快了不少,然而,在我unmute这些断点后,我发现,这些断点并没有给我任何log信息。原来是我手动unmute断点的时间晚了。只要在程序完全启动的时候,unmute断点,这样,我就不会错过断点了。
下图的红框中的设置,表明我们可以在某个断点出发后,启用这个断点。
在SpringBoot项目完全启动后,下一个断点在自己的代码上。这个断点用来“通知”foodCartViewRepository
断点,这个断点是黄色的,因为程序不会暂停Suspend在这里
然后针对foodCartViewRepository
字段断点(注意黄框,这个断点是Enabled的,只是,在红框中的设置,使得这个断点在程序完全启动前(前面设置的那个断点)是出于禁止的状态)
这样,以调试模式启动程序的时候,时间花费不会太长,并且,我们可以完整的追踪foodCartViewRepository
的访问情况。完美!!
小结
简单的情况下,使用行断点
非调试情况下查看程序的运行情况,使用logger
查看对字段的访问和修改,使用字段断点
比较复杂的情况,综合使用断点。