IDEA 中使用Debug
Debug 简述
Debug用来追踪代码的运行流程,通常在程序运行过程中出现异常,启用Debug模式可以分析定位异常发生的位置,以及在运行过程中参数的变化。通常我们也可以启用Debug模式来跟踪代码的运行流程去学习三方框架的源码。
基IDEA 调试功能说明 🛠️
Show Execution Point
- 快捷键: Alt + F10
- 功能描述: 回到当前激活的断点处。如果你在调试过程中失去了当前断点的位置,只需一键点击,IDEA将立即把视图带回至断点所在行,确保你能迅速回到问题的核心位置。
这种方式不仅保留了原文的技术性描述,而且通过添加动作的直接效果(“立即把视图带回”),使得说明更加生动和易于理解。此外,使用emoji也帮助在视觉上突出这一部分,增加文章的友好感和易读性。

Step Over
- 快捷键: F8
- 功能描述: 单步调试,逐行向下执行。当执行的代码行调用其他方法时,此功能将不会跳入那些方法内部,而是直接跳过。这是日常 Debug 中使用频率最高的功能之一,允许开发者在不深入每个方法的情况下,快速过滤代码执行流程。

Force Step Into
- 快捷键: Alt + Shift + F7
- 功能描述: 强制深入。此功能扩展了 Step Into 的能力,允许你强制进入任何方法体内部,包括JDK的核心方法。当你需要详细了解底层实现或第三方库与JDK的交互时,这将是一个非常有用的工具。

Step Out
- 快捷键: Shift + F8
- 功能描述: 快速返回。当你已深入到一个方法体内部并需要返回到上一级代码执行点时,使用此功能。它是 Step Into 或 Force Step Into 的完美配合工具,允许你在完成方法内部的调试后迅速跳出,继续其他部分的调试工作。

Drop Frame
- 功能描述: 回溯重置。这个功能允许你将执行回溯到当前方法的调用处,并将所有相关变量的值重置到那一时刻。这是在深入调试时的一个重要工具,尤其当你需要重新评估方法执行的影响时非常有用。
- 使用条件: 该功能只在当前方法有上级方法时可用。例如,如果你处于 main 方法中,该按钮将显示为灰色,无法使用。

Run to Cursor
- 快捷键: Alt + F9
- 功能描述: 精准执行。此功能允许你直接运行代码至光标所在位置,无需设置额外的断点。这是进行快速测试或当你想专注于特定代码段时的理想选择,使调试过程更加高效和直观。(提前是之前的代码没有断点)

Evaluate Expression
- 快捷键: Alt + F8
- 功能描述: 在断点处,IDEA不仅允许查看变量值,还可以执行代码、方法或表达式。这使得开发者能够动态地测试和修改程序行为,而无需修改源代码并重新编译。

Trace Current Stream Chain
- 功能描述: 流追踪优化。这个功能专为Java Stream操作设计,它允许你追踪并可视化当前Stream流的处理链。只有当你的光标位于Stream操作的代码上时,此按钮才会激活,提供直观的方式来理解和调试复杂的Stream操作。

Rerun Main
快捷键: Ctrl + F5
功能描述: 重新执行。此功能允许你快速重新启动主程序的调试会话,无需手动停止并重启,极大提高调试效率。这是在进行长期或复杂的调试任务时尤其有用的功能,允许开发者持续追踪代码改动的影响。

Resume Program
- 快捷键: F9
- 功能描述: 继续执行。使用此功能可以从当前断点恢复程序的运行,直到遇到下一个断点或程序执行完毕。这是调试过程中用于控制程序流的核心功能,允许开发者在需要时暂停查看程序状态,随后继续执行以观察程序行为的变化。

Stop Main
- 快捷键: Ctrl + F12
- 功能描述: 立即停止。此快捷键让你能够随时中断当前运行的程序。它是在测试或调试时快速结束程序执行的有效方式,特别是当遇到无法预期的行为或需要终止长时间运行的操作时。

View Breakpoints 📍
- 快捷键: Ctrl + Shift + F8
- 功能描述: 管理断点。此快捷键打开一个专门的断点管理窗口,允许你查看、编辑、启用或禁用所有设置的断点。这是优化调试流程的关键工具,使你能够精确控制程序在何处暂停执行,以便更详细地检查和修改代码行为。

Mute Breakpoints 🔇
功能描述: 暂停所有断点。此功能允许你一键停用所有活跃的断点,使程序能够不受干扰地继续运行至结束或至下次手动暂停。这是在需要快速验证程序整体行为或进行性能测试时非常有用的工具,避免了频繁的中断带来的不便。

Get Thread Dump 🧵
- 功能描述: 获取当前线程Dump。此功能允许你捕获并查看当前所有线程的状态信息,非常适合用于分析程序的并发行为和诊断死锁或其他线程相关问题。通过详细的线程Dump,开发者可以深入了解每个线程的执行路径及其互动,从而优化程序性能和稳定性。

筛选 🗂️
- 功能描述: 进一步细化信息展示。在处理复杂的线程Dump或大量数据时,筛选功能可以帮助你快速定位关键信息,简化调试过程,确保可以集中注意力解决当前最紧迫的问题。

小结

断点属性配置

Enabled
表示是否启用该断点,选中表示启用,取消选中表示不启用。当不选中时,断点显示的是空心圆 
Suspend
Suspend属性除了自身是否勾选之外,还有两个选项:All、Thread;
- 当断点的 Suppend 属性被勾选,触发该断点时,程序挂起;当该属性未选中时,程序触发该断点时,程序不会挂起,不勾选Suspend属性的操作,常用于输出一些表达式结果日志(源断点就是不会勾选Suspend,断点为黄色)。
- 当断点的 All 属性被勾选,触发该断点时,会挂起所有线程;
- 当断点的 Thead 属性被勾选,触发该断点时,只会挂起触发该断点的那个线程,不影响其他线程;实际生产实践中,可用于调试多线程并发的问题。
Condition
输入一段能获得true或false的表达式,程序运行到断点处,且表达式条件为true才会触发断点(设置Condition 说明该断点为条件断点,表现形式为断点带问号)。 
Log
Log有三个属性选项经常配合 Suppend 属性不勾选时 一起使用,用于在不挂起程序的情况下,输出一些想要的日志信息;
- Breakpoint hit message :控制台输出触发断点的日志信息;
- Stack trace:输出触发断点时的堆栈信息;
- Evaluate and log:计算表达式结果并输出表达式结果到控制台; 表达式的计算基于断点所在行的上下文,表达式的语句可以是字符串字面量、方法调用、也可以是多行语句块;

效果展示 
Remove once hit
是否在断点触发后移除该断点,后续不再触发; 
Disable until hitting the following breakpoint
当指定的断点命中时禁用本断点
- disable again:当前断点会被禁用,但不会删除。这意味着你可以在需要的时候重新启用这个断点,而不需要重新设置。这在调试过程中非常有用,特别是当你需要临时禁用某个断点,但又不想永久删除它时。
- leave enable:这意味着断点在程序执行到该断点时会被触发,并且在该方法执行完毕后,断点仍然保持启用状态。这与“disable again”相反,断点不会被禁用,而是保持启用状态,允许你在方法执行完毕后继续调试。

Filters
- Insert filters:将断点操作限制为特定的对象实例。 这种类型的过滤器只在非静态上下文中生效。
- Class filters:将断点操作限制为特定类;
- Caller filters:根据当前方法的调用者限制断点操作。 选择是否仅在从某个方法调用(或不调用)当前方法时才需要在断点处停止。
Pass count
- 指定一个计数N,每当第N次经过该断点停留;如果同时设置了condition 与 pass count 属性,ide会优先判断 condition 表达式,再判断 pass count 是否满足

断点类型
源断点
源断点在断点处程序不会暂停,而是直接执行过去。源断点主要用于展示断点的详细信息,而不是用于调试暂停。按住Shift键并用鼠标左键点击代码行可以设置这种断点,它不会阻塞程序的执行,而是在控制台输出断点信息。这种断点的用途主要是为了在不中断程序执行的情况下,提供断点相关的详细信息。

行断点
行断点的图标是一个圆形的红点,在需要断点的代码行头点击,即可添加断点。这是最基本也是最频繁使用的断点类型,允许你在代码执行到特定位置时暂停,非常适合逐步跟踪和问题定位。 
方法断点
方法断点允许你在特定方法的入口处设置断点(形状为菱形)。当该方法被调用时,无论从哪里调用,执行都会在这里暂停。这对于调试使用了策略、模板方法等设计模式的应用非常有帮助。

字段断点
在类的的属性上打断点(眼睛的形状),每次该属性值发生变化或被读取时停留,用于追踪一个属性值的变化情况

异常断点
异常断点是一种强大的调试工具,允许你在指定异常发生时自动暂停执行,这对于快速定位和解析程序中出现的错误至关重要。
异常断点有两个特有的配置:Caught exception 和 Uncaught exception 选项。
- Caught exception选项选中时,当指定的异常被捕获时,触发断点程序挂起;
- Uncaught exception选中时,当指定的异常未被捕获时,触发断点程序挂起;
异常断点的添加方式:在断点列表页中,做如下操作 
选择Java Exception Breakpoints,弹出如下窗口;选择完之后点击勾选该异常断点 
运行程序,当程序没有打断点时,但是程序代码出现该断点设置的异常,执行会自动暂停,允许你直接查看和处理引发异常的代码行 

断点的状态
Verified(图标上有一个小勾):命中状态。当程序开启debug会话时,在断点被命中后,这时debugger会将其标记为Verified
Invalid:不可用状态。当断点打在不可执行行,这个断点永远不会生效
Inactive/Dependent:未激活状态
Muted:静默状态,所有断点被暂时被禁用
Disable:禁止状态
Non-suspending:非停留状态

