暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

进击のIDEA断点调试——基础篇

糖爸的架构师之路 2021-06-24
2273
写在前面

距离上次更新已经有一段时间了,之所以这么久没更新,是因为我非常喜欢的一部番剧——进击の巨人,漫画篇完结。心情一直比较沮丧,所以也没有心思更新。虽然这部漫画以一种很不友好的方式结局,但是这并不能妨碍它被封为神作。尽管早在几年前,进击的巨人就已经被官方列为禁播,原因是剧情中有很多情节过于血腥,但是究其核心,还是因为漫画的作者——谏山创是日本右翼,并且剧情的走向经过很多人的剖析,也确实暗含了一些右翼的论调。不过作为一个单纯喜欢二次元向的我来说,并不想去过多的解读,毕竟这是一部我追了十多年的剧,虽然是月更,但它陪伴着我从学生时代到而立之年,陪伴了我很多个无聊的夜晚,同时也给我带来了很多欢乐。从剧情上来说,进击の巨人世界观宏大,故事情节紧凑,尤其是被霸权社改为动画制作后,更是吸引了一大批粉丝,无论从BGM、故事逻辑的严谨性,还是打击感、分镜,包括文戏、人物的塑造等等,都称得上巅峰之作。以至于第一次看到这部动画的时候,经常看的目瞪口呆,原来动画还可以这样演。现在它完结了,无论最后的结局是不是被大众所喜欢,对于我来说,其实都可以接受,虽然心里有些难过,总感觉空落落的,为什么会是这种意难平的结尾?但是还是要谢谢谏山创,抛开所有的不谈,至少他创作的一部叫做进击的巨人的漫画,陪伴了我的成长,给我带来了很多的欢乐,这就足够了。最后还要大喊一声,巨人yyds~~~

言归正传,作为Java开发人员,相信现在绝大部分的小伙伴都已经在使用IDEA作为主力开发工具,我也不例外。IDEA以其友好的界面,优秀的稳定性和可扩展性,在短短几年内俘获了大批的Java开发人员抛弃Eclipse投向IDEA的怀抱,虽然在编译器方面(默认依然在使用javac编译)性能稍差,但是并不影响大家对它的喜爱。今天我就基于IDEA,详细说一下IDEA中的断点调试。关于断点调试,虽然大家平常都在使用,但是可能很多人只是使用了它很小的一部分,其实它还有很多很强大的功能,我们可以通过了解这些功能,使我们的debug效率更上一层楼。这个应该会是一个系列,内容包括今天的基础篇,之后的文章会介绍一些高阶功能,例如多线程调试,远程调试,条件断点等等。
断点分类


在IDEA中,断点大致可以分为5类

行断点

源断点

方法断点

字段断点

异常断点

...

我们一个一个来说

行断点

行断点是我们开发中用的最多的一种断点。它应用于方法体内部的某一行代码。只需要在需要断点的那行代码左边点击鼠标左键,就会看到一个红色的小圆点,这时我们以debug模式启动,如果该方法被调用,那么当执行到断点的那行代码时就会停住供我们进行调试和修改工作。如下图:

这里要单独说一下,通常和断点调试一起配合使用的还有方法调用栈、控制台、变量列表等等(由于篇幅有限,这里只说这三个),以及各种调试执行按钮。

调用栈可以方便的查看在断点之前有哪些方法被调用,这个在查看一些框架的源码,尤其是调用层次很深的情况时显得格外有用。如下图:

控制台主要输出一些日志的打印,包括异常信息、业务日志、服务启动日志等等。如下图:

变量列表方便我们查看在进入断点之前各个变量的值。如下图:

下面截图中红框部分是各种调试执行按钮,我们从左到右一个一个来说

  • Show Execution Point:立刻将光标停留到当前断点执行的代码。这个功能可以帮助我们快速的定位到断点执行的所在位置。
  • Step Over:单步调试,代码在断点位置向下执行一行

  • Step Into:进入方法。如果当前断点位置存在调用其他方法,点击此按钮就可以进入到被调用的方法内部(仅限于当前工程中的方法)。

  • Force Step Into:进入方法。功能和Step Into一样,但Force Step Into可以进入任意方法。例如toString()方法,Step Into会直接跳过,使用Force Step Into才会进入方法内部

  • Step Out:与Step Into功能互补,可以使断点跳出进入的方法并回到方法调用者在调用进入的方法之后的一行代码

  • Drop frame:这个功能比较有意思,丢弃当前栈帧。会直接返回到方法调用者调用方法的那行代码,如果继续执行,断点会再次进入被调用的方法。这个功能要和force return区分开,想象一下,如果打了一个行断点,当代码运行到断点位置时,我们经过调试发现这行代码需要修改,这时肯定要将应用停下来,后面的代码就不需要执行了。要做到这点,通常情况下我们会直接点停止按钮,但是这里即便我们点了停止按钮,在当前方法内部,断点后面的代码也依然会执行。在网上很多的文章中都提到Drop Frame就是帮助我们避免这种问题的,它会将当前栈帧从断点处直接销毁,后面的代码就不会执行了。

这个是错误的~~

该功能其实在Frame中。看一下下面的例子

上面的代码中,如果直接点击左侧橙色框中的按钮,虽然应用停止,但是可以看到控制台依然打印了这两句话。也就是说,应用时在line()方法完全执行完毕后应用才结束。而如果使用Frame面板中的Force Return(选中方法点击右键),就只会打印第一句话,第二句打印就不会执行了

  • Return to Cursor:断点会调到当前光标所在的位置。这个也很实用,例如当代码执行到我们设置的行断点时,如果我们还想让程序停在后面的某一行代码,通常做法会再打一个行断点,然后让程序直接运行。有了这个功能,就可以省去我们再打一个断点的步骤,直接将光标停留在我们想要断点的位置,然后继续执行就可以了。
源断点

刚才介绍了行断点和一些经常配合断点使用的周边,下面我们来说一下源断点。源断点本质上不会将程序停在再被断点处,也就是说程序运行不会受到影响,但是会在运行到有源断点的代码处打印断点信息。如下图,和行断点相同,在想要断点的左侧,按住shift+鼠标左键,会呼出断点详情面板。勾选Enable,点击Done,断点就会变成黄色。

运行程序后可以看到控制台打印的断点信息。

那源断点有什么作用呢?试想一下,如果我们在打了过多的行断点后,为了不影响程序运行,需要暂时取消掉一些行断点,但是又不想彻底取消,因为后面还有可能再次开启。这种情况下就可以将行断点改为源断点,只需要在刚才的面板中将Suspend取消选中即可。当想再次启用时,根据打印的断点信息找到源断点,再次将Suspend选中并选择All,完成后源断点就又变回行断点了。


方法断点

方法断点顾名思义就是使用在方法上的断点。它和行断点的区别在于,方法断点直接打在方法名称那一行,点击后会出现一个菱形的图标。如下图:

这里要注意一下,我们只打了一个断点,且该断点不在方法体内部,运行程序可以发现,在进入方法前后离开方法前会自动停留,这个在我们调试整个方法内部的代码时也是非常有用的。如下图:


异常断点

异常断点主要使用在当程序出现异常时,IDEA可以帮助我们通过断点的方式快速跳转到出现异常的那一行代码,并且可以根据异常的类型进行全局设置。设置方法如下图:

IDEA左下角有两个和断点相关的按钮

第一个为断点详情设置

第二个为忽略所有断点。如果你想一键设置所有断点都失效,可以使用此按钮,这个会在后面的文章中详细说,今天暂且不表。

设置异常断点,我们需要打开断点详情设置面板,如下图:

其中红框内的就是异常断点的设置功能,默认不勾选。当我们勾选Any exception,如果程序出现任何类型的异常,都会进行捕获定位,IDEA会立即跳转到异常出现对应的代码。大大提高我们的效率。
如果想要根据异常类型进行有针对性的捕获,可以如下图设置:
点击左上角的+按钮,选择第三个:异常断点

查找要捕获的断点类型,例如空指针异常

选中后就会在详情面板中看到我们刚才选择的异常,如果我们要单独捕获空指针异常,则可以将Any exception取消勾选

注意,运行程序前,我们没有打任何一个断点

运行后,因为obj=null,当obj.toString()执行后,会出现空指针异常,此时断点会自动停在有问题的那行代码,怎么样,是不是很妙~


字段断点

字段断点可以帮助我们定位字段的赋值过程,提高调试效率。尤其是在浏览一些框架的源代码时,当我们想了解一下一个对象的属性是在何时赋值时,由于庞大的代码量和复杂的文件结构,导致一时无法了解方法调用链,此时就可以使用字段断点,在字段被赋值时可以通过断点查看前后的调用栈,帮助我们快速的理清思路。

具体使用很简单,只需要在字段处打一个断点,就会有一个小眼睛图标的断点,如下图:

User类中有username属性,并且提供了访问器方法,在username中加入了字段断点。

外部调用时首先调用构造器方法对username进行赋值,其次会调用user对象的setUserName方法对username属性再次赋值,最后调用getUsername方法获取username属性值并打印。所有代码除字段断点外,没有任何其他断点。
运行程序,发现在构造器方法和setUsername()方法被调用时均有断点停留,但getUsername()方法被调用时,并没有断点停留,可以证明字段断点就是当字段值被修改时才生效。

以上就是5类断点的基本介绍,合理的运用断点可以让我们快速的找到代码中所隐藏的问题,大大提高了debug的效率,所以使用断点这个技能还是有必要熟练掌握的,谢谢阅读到这里的你,希望这篇内容对你有所帮助。之后大概还会有一到两篇是介绍断点使用的一些高级功能。敬请期待吧~
文章转载自糖爸的架构师之路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论