# IDEA 中 debug 断点调试

# debug调试常用

F5 单步调试进入函数内部 F6 单步调试不进入函数内部 F8 如果下面代码没有断点,那么回执行完全部代码;如果下面有代码,那么回跳转到下面的断点。

# 为什么要学代码的调试?

代码能帮你创造奇迹,但有时也会让你生不如死。往往一个很简单错误,结果却花了好长时间也没解决。所以作为一个合格的 Java 程序员,不能只会写代码,记流水,也要会分析和解决代码中遇到的问题,也就是说不能只是会点火,也要会灭火,这也是企业中最需要的一种能力。掌握 Java 代码的调试的技巧是 Java 程序员必备的技能,也是提高编码效率的一个非常关键的一个环节。

Debug 能力我觉得其实和搭环境有点像,买来一台新电脑,先设置各种配置,装工具,搭建开发环境之类的,也要花个几天时间,有些人会比较不耐烦想快点开始写代码,但其实磨刀不费砍柴功,长远打算是不亏的。最好的办法就是开发的时候足够细心,流程规范,砍柴砍的认真点专注点,这样比起你写出一大堆 bug,或是砍柴到一半没砍好砍错了出各种问题再去解决,还是要高效的多的。

# 如何进行代码的基本调试?

断点运行和日志记录是排查问题的两个主要手段,如果没有断点调试,很多问题的排查将更多地依赖日志。但是日志无法直观地了解代码运行的状态,无法实时地观察待调试对象的各种属性值等。

# 基于IDEA进行基础的断点调试

无论使用什么工具,断点的第一步是设置断点,在哪里设置断点也很关键,通常要结合业务进行设计,这里我们先看一个简单案例,如图所示:

image-20220422103631726

我想分析一下整数自动封箱以及从整数池中获取对象的过程,在图中的第 5 行设置了断点,然后基于断点模式启动运行项目,并基于图中的数字位置的功能按钮,单步调试。

其中,图中描述的数字,是 IDEA 中 debug 调试的最基本功能,其含义如下:

  1. Step Over 即跳过,执行到下一行;
  2. Step Into 即步入,可以进入自定义的函数(没有自定义则进入下一行,上面的截图中,假如执行这个动作,则直接进入下一行。);
  3. Force Step Into 即强制进入,可以进入到任何方法(包括三方的,在上面的截图中可以直接进入 Integer 类的 valueOf 方法,看到自动封箱过程。);
  4. Step Out 即跳出,如果当前调试的方法没问题,可以使用此功能跳出当前函数;
  5. Drop frame 即移除帧,相当于回退到上一级;
  6. Run to Cursor 即执行到光标所在的代码行数。

这里仅是 debug 模式的基本功能,还有“variables(变量区)” 初学者用的最多,还可在variables可以观察变量值的变化,具体过程还需要自己进行实践分析。

# 个人心得

有的人认为 debug 是个高智商的活,确实也是这样,对于复杂的问题不仅需要经验,还要有大量的技巧和思考设计。不过我更认为,这是一个需要很强耐心的活,你不一定总能保证几个小时内高强度的头脑风暴就可以解决问题,长远来看,就是靠耐心。我觉得 debug 更像是一个渔翁钓鱼的过程,坐在平静的湖边慢慢等着,或许过程会充满各种痛苦吧,但当你花了四五天时间解决了一个bug,那种喜悦感,是别人体会不到的,而且每次这种艰难的 debug 都会让你印象深刻,得到巨大的经验成长,这是你再怎么搜答案用工具也学不来的。

参考资料:

IDEA中断点方式的代码调试。 (opens new window)