【玩转IDEA】关于debug你可能还不知道的技巧,2021Java面试笔试总结
文末附去哪网内推
嗨,大家好,我是一条。
当我在处理一个名为"bug"的错误时,在数据库中发现存在一组共有66个数据项的情况。这时必须访问到某个字段非空的状态以便进一步排查问题。恰好吸引了旁边同事的关注。
“你不知道debug可以设置条件吗”
“咦,好像听过,怎么用呀?”
……
今天与大家分享一些你可能还不了解的调试技巧。特别针对那些刚开始学习编程知识的新手朋友,我们将从基础部分开始逐步讲解。
一个不会debug的程序员不是好程序员
对于一名程序员而言,在评估一个人的专业能力时,并不是看他编写了多少代码片段来判断其优秀程度;相反地,则关键在于他是否能够成功地解决实际问题。
debug主要用于监控代码的执行路径,并通过这一过程识别和定位异常发生的具体位置以及观察运行过程中各参数的变化情况。另外一种方式是通过监控代码的执行路径来学习三方框架的具体实现。
说白了就是控制程序一步一步的走,而不是瞬间就跑完。
因为目前主流开发都用idea。所以拿idea举例,主要包括如下内容:
基本操作
计算表达式
智能步入
断点条件设置
多线程调试
回退断点
中断Debug
一、基本操作
首先以Debug模式启动应用,观察一下界面的变化。
Debug调试的基础功能主要对应着以下三点。

1.第一组按钮
共8个按钮,从左到右依次如下:

- Show Execution Point (Alt + F10):如果你的光
docs.qq.com/doc/DSmxTbFJ1cmN1R2dB
docs.qq.com/doc/DSmxTbFJ1cmN1R2dB
标在其它行或其它页面,点击这个按钮可跳转到当前代码执行的行。
Step Over (F8):步过,一行一行地往下走,如果这一行上有方法不会进入方法。
Step Into (F7):踏步键(F7)。当遇到有方法的行时,默认会调用该行的方法;特别地,在处理自定义类或包时通常会使用此功能;例如,在第25行中调用put方法时会触发此操作。
Force Step Into (Alt+Shift+F7):强行引导Alt+Shift+F7键入(缩写:FSI)。适用于所有开发场景中使用此快捷方式将直接引导至目标代码路径。在探索底层代码时,请通过此快捷方式访问官方类库。
Step Out (Shift + F8):退出该方法至函数调用位置处。在此时阶段已完成该操作流程。
Drop Frame (默认无):回退断点,后面章节详细说明。
Move the cursor to the desired location using Ctrl + Shift + R, which allows you to directly set the current position as the target row when this function is used.
Evaluate Expression (Alt + F8):计算表达式,后面章节详细说明。
2.第二组按钮
共7个按钮,从上到下依次如下:

Rerun ‘xxxx’:重新运行程序,会关闭服务后重新启动程序。
重新启动或更新程序(Ctrl + F5):通常当你修改代码时会自动执行此操作。其相关操作通常位于服务配置页面。
Resume Program (F9):该功能用于恢复执行流程(F9键)。例如,在代码中设置了两个断点(分别位于第20和25行处),当前正在执行第20行代码。按下一次F9键将跳转至下一个断点位置(即第25行),再次按下F9则将执行整个流程(因为没有后续的断点设置)。
Pause Program:暂停程序,启用Debug。目前没发现具体用法。
按下快捷键组合(Ctrl + F2)来停止'xxx'。重复按下两下会使程序退出。有时你可能会遇到这样的情况:当关闭服务后重新启动时系统提示显示端口已被占用。这通常是因为未彻底关闭服务的原因导致的。为了修复问题,请必须清除所有JVM进程以解决问题。
View Breakpoints (Ctrl + Shift + F8):查看所有断点,后面章节会涉及到。
Mute Breakpoints 也被称为哑的断点,在编程环境中使用时会将所有当前的断��变为灰色并使其失效;按下快捷键F9后可以直接执行整个程序;再次点击该处会使这些被关闭的断裂恢复活性变为红色;如果只想使某一个断裂失效,则在该断裂上右键操作取消Enabled状态
3.变量查看
在Debug过程中深入分析变量的变化情况是十分关键的一步。具体来说,在IDE中可以快速定位到哪些位置来查看这些信息?相信大多数开发人员都能熟练掌握这些技巧。
参数所在行后面会显示当前变量的值。
光标悬停到参数上,显示当前变量信息。
在Variables里查看,这里显示当前方法里的所有变量。
在Watches界面中,单击创建新监视器按钮,并输入需要监控的变量名。此外,在Variables区域拖动要监视的变量至Watche窗口即可查看其状态信息。如果找不到监视器列表,请检查所在位置是否正确配置了监视器资源。

二、大神操作
1.计算表达式
在上文中讨论过的计算表达式中,请注意Evaluate Expression(Alt + F8)这一功能。
该功能可用于在调试过程中快速获取某个特定表达式的值,并无需额外打印信息。

按下快捷键组合Alt + F8 ,或单个按钮 ,或者可以选择双击某个表达式或再次按下快捷键组合 Alt + F8 ,打开计算该表达式的对话框
如下,回车或点击Evaluate计算表达式的值。
它既可以表示一般变量或参数,也可以是一个方法,在你的代码中多次调用不同的方法时,则可以通过这种方式快速获取该方法的返回值。
在计算表达式的窗口中进行参数设置和更换可以让变量的值进行调整这样有时候也能让操作更加便捷

2.智能步入
想想,一行代码里有好几个方法,怎么只选择某一个方法进入。
之前曾提及一种操作(Alt + F7)用于触发进入方法内部;而另一种则是(Alt + Shift + F7),它们按照执行顺序依次被触发。
这一方式非常便捷。Step into这一功能非常便捷,在Run页面中可以看到其详细信息。Smart Step Into (Shift + F7)
按下Shift + F7组合键,在程序调试界面将自动定位到当前断点行,并会展示所需的方法以供进一步操作。单击该方法以深入查看其详细信息。

3.回退断点
在调试的时候,想要重新走一下流程而不用再次发起一个请求?
首先定位调用堆栈 区域,在Idea中发现无法逐一调试返回至前一断点处的情况,则应转回至前一层次的函数。
但有一点需要注意的是,在进行断点回退操作时只能重新执行一次流程,在此之前由于某些参数或数据已经被修改过状态的原因下是无法恢复到最初状况的。例如,在处理对象、集合以及更新数据库数据等情况时就属于这种情况
回退的方式有两种。
其中一种是Drop Frame组件(此处指代某对象),它通过按调用的方法依次退出当前组件栈。取消Show All Frames按钮将导致显示三方类库的具体方法

在调用栈方法中选择一种需要回退的方式,在选定后通过右键点击选中'Drop Frame'选项,返回至当前所选方法之前一个被调用的方法处。然后按下F9键(Resume Program),即可观察到程序已到达所选断点位置。

4.中断debug
想要在Debug的时候,中断请求,不要再走剩余的流程了?
有时候发现输入的参数存在错误后不想继续执行后续流程的时候
具体地说, 我也未能找到一种直接中断请求的方式(除了关闭服务),但可以通过Force Return机制来强制返回以避免后续流程。
