模式切换
Debug 调试
Debug 模式用来追踪程序运行并进行细粒度分析,最终定位到异常发生的位置。在调试过程中可以实时观察各项参数的变化,还可以根据需要对参数进行调整与计算。
结合其他框架进行调试时,Debug 模式还可以深入框架内部追踪执行过程并定位问题。
Debug 模式离不开断点,断点提供了在程序执行到不同位置时的阻塞状态,用户可以基于断点查看程序运行的状态并且有步骤地进行调试,并最终确定调试结果与预期是否一致。
IntelliJ IDEA 为断点的调试提供了强大的功能支持,例如可以自定义断点的属性、表达式的实时计算、变量值的动态更改等。
窗口布局
在进行单元测试时,Debug 模式可由工具栏上的“小虫”图标按钮启动触发,也可以在快速启动或右击菜单中选择 Debug 命令运行。
当程序以 Debug 方式运行后系统会展开 Debug 调试窗口来帮助开发者进行调试。
断点是进行 Debug 调试的前提,它表示了调试的具体位置。当程序运行到断点时会自动阻塞并交由用户来完成后续的执行步骤,通过在调试过程中随时观察与修改具体的参数以发现异常位置及产生的原因。
所以在使用 Debug 方式进行调试时,至少需要一个断点。如果没有断点,那么程序会直接运行完成,并不会阻塞。
按钮与快捷键
服务按钮
在 Debug 调试窗口中最左侧的是服务按钮,主要作用是负责关闭/启动服务,以及设置断点等。
- 按钮“Debug”是 Debug 模式的启动按钮,在程序停止后可再次单击此按钮启动 Debug 模式运行。在启动之后会变为“Restart Debug”按钮,单击此按钮后程序会自动跳过所有的断点重新运行并且在第一个遇到的断点处阻塞。
- 按钮“Resume Program”是 Debug 模式的恢复按钮,单击此按钮后程序将从中断状态恢复并继续向下执行直至遇到下一个断点或运行结束,它可以跳过当前断点。
- 按钮“Pause Program”是 Debug 模式的暂停按钮,单击此按钮后可以在程序运行当前位置发起暂停,当暂停发起时如果当前执行位置没有设置断点,则依然可以启动断点调试的功能或使用恢复按钮继续向下执行。由于行级程序单步执行速度比较快,因此很难捕捉到一个准确的执行时间点,但是对于线程等执行时间较长的任务比较有效。
- 按钮“Stop”用于终止当前程序的运行,终止运行的程序可以通过“Debug”按钮再次启动调试。
- 按钮“View Breakpoints”用于查看程序中所有的断点。
也可以右击任意的断点,点击“More”(快捷键为 Shift + Cmd + F8)来打开查看所有断点窗口。
在“Breakpoints”窗口内可以增加或删除断点,也可以设置断点的属性。
- 按钮“Mute Breakpoint”用于对断点执行静音操作,单击后会使所有未执行的断点在当前运行环境中失效,从而让程序快速执行到最后,当再次运行调试时所有断点将会再次生效。
- 按钮“Get Thread Dump”可以获取当前系统运行的快照。
- 按钮“Settings”用于进行额外的操作,如显示行内值、恢复被静音的断点等。
调试按钮
调试按钮包含 8 个主要操作按钮,用于断点调试过程中的追踪、跳跃等操作。
- Show Execution Point(跳转执行点)
当调试窗口处于调试状态且未运行完成时,跳转执行点可以将光标快速定位到当前调试位置对应的代码行。如果编辑区中打开多个文件使得光标在其他行或其他文件中,则单击此按钮可以快速找到正在调试的位置。
- Step Over(步过)
单击此按钮可以将调试过程逐行向下执行,如果某行上有方法调用,则不会进入方法内部。
- Step Into(步入)
当调试步骤执行到某一行时,如果当前行有方法调用,则会进入方法内部,这些方法通常为用户自定义的方法,不会进入官方类库的方法。
- Force Step Into(强制步入)
强制步入与步入一致,且其图标为红色。当调试步骤执行到某一行时可以强制进入任何方法,此操作对于调试框架底层源码或官方类库十分有用,也是对步入功能的补充。
- Step Out(步出)
当执行步出操作时会将步入操作的方法执行完毕,然后退出到方法调用处,只是还没有完成赋值。
- Run to Cursor(运行至光标)
用户可以将光标定位到指定行,使用这个功能时代码会运行至光标行处且不需要打断点。
- Evaluate Expression(表达式计算)
此操作可以在调试过程中计算某个表达式的值,而不用再去打印信息。
表达式窗口还可以动态地设置某些变量或结果的值。
查看变量
在调试过程中开发者需要对变量进行跟踪以观察程序运行是否达到预期,IntelliJ IDEA 中提供了多种查看变量的方式。
在进行 Debug 调试时,IntelliJ IDEA 会在代码的行末显示出已经计算出来的表达式值。
上述显示方式对于赋值类计算比较直接,但由于某些操作并不是赋值操作,如深度调用,因此这些值无法直接显示。
如果需要观察某些参数的变化,则可以将光标悬停在参数上,此时 IntelliJ IDEA 也会显示当前变量(或对象)的信息。
IntelliJ IDEA 提供了 Variables 变量窗口来查看所有变量的信息。
如果 Variables 窗口中显示的变量信息过多,则对其查看也不方便。IntelliJ IDEA 提供了 Watches 窗口来辅助开发者查看具体某个变量的信息。
在需要查看的变量上右击选择 New Watch 即可添加。
设置断点条件
在进行调试时某些操作可能是在递归或者遍历中进行条件判断的,在这种情况下很难控制进入指定的层次。通过设置断点条件以在满足条件时阻塞在断点处,可以有效地进行调试。
设置断点条件十分简单,右击需要设置条件的断点便可弹出条件设置窗口。
多线程调试
当进行某个 Debug 调试运行时可能需要发起另一个 Debug 调试,因为当前的 Debug 调试还没有停止,所以 IntelliJ IDEA 会弹出对话框并由用户选择是否终止当前正在运行的调试。
IntelliJ IDEA 在进行 Debug 调试时默认的阻塞级别为 ALL,会阻塞其他线程导致无法再次发起调试,只有在当前线程运行完或终止时才可以发起其他调试线程。
为了能够以多线程的方式进行调试,需要将 Suspend 的值更改为 Thread。勾选后会显示 Make Default 按钮,直接确认后将多线程方式设置为默认方式。