在开发中,新手程序员在查找错误时, 这时老程序员就会温馨提示,可以用断点调试,一步一步的看源码执行的过程,从而发现错误所在。
重要提示: 断点调试过程是运行状态,是以对象的运行类型来执行的
断点调试介绍
断点调试是指在程序的某一行设置一个断点,调试时,程序运行到这一行就会停住,然后你可以一步一步往下调试,调试过程中可以看各个变量当前的值,出错的话,调试到出错的代码行即显示错误,停下。进行分析从而找到这个Bug断点调试是程序员必须掌握的技能。断点调试也能帮助我们查看java底层源代码的执行过程,提高程序员的Java水平。
基本概念
- 断点(Breakpoint):在代码中设置的特定位置,当程序运行到该位置时,会暂停执行,以便开发者检查程序的状态。
- 调试会话(Debug Session):启动调试模式后,程序在 IDEA 的控制下运行,开发者可以通过各种调试工具与程序交互,这个过程称为调试会话。
- 调试工具窗口:IDEA 提供了专门的调试工具窗口,用于显示调试相关的信息,如变量的值、调用栈、线程信息等。
操作步骤
- 设置断点:在 IDEA 的代码编辑器中,单击要设置断点的代码行左侧的空白区域,会出现一个红点,表示断点已设置。也可以通过右键单击代码行,选择 “Toggle Breakpoint” 来设置或取消断点。
- 启动调试:可以通过以下几种方式启动调试会话。
- 点击 IDEA 工具栏中的 “Debug” 按钮,选择要调试的 Java 类或启动配置。
- 使用快捷键,如在 Windows/Linux 系统中通常是 “Shift+F9”,在 Mac 系统中是 “Control+Shift+F9”。
- 在 “Run” 菜单中选择 “Debug”,然后选择相应的启动配置。
- 调试工具窗口:启动调试后,IDEA 会显示调试工具窗口,主要包括以下几个部分。
- Variables(变量):显示当前作用域内的变量及其值。可以通过双击变量来修改其值,方便进行测试和调试。
- Call Stack(调用栈):显示方法的调用顺序,从当前执行的方法开始,向上追溯到方法的调用源头。可以点击调用栈中的方法,查看该方法调用时的上下文信息。
- Threads(线程):显示当前正在运行的线程信息,包括线程的名称、状态等。可以在多线程程序中,方便地切换到不同的线程进行调试。
- 调试操作
- Step Over(单步跳过):快捷键是 “F8”。程序会执行下一行代码,如果下一行代码是方法调用,会直接执行完该方法并返回,不会进入方法内部。
- Step Into(单步进入):快捷键一般是 “F7”。如果下一行代码是方法调用,会进入方法内部,继续单步执行。
- Force Step Into(强制单步进入):可以强制进入任何方法,包括 Java 核心类库中的方法,而不仅仅是用户自定义的方法。
- Step Out(单步跳出):当进入一个方法内部后,使用 “Step Out”(快捷键通常是 “Shift+F8”)可以执行完当前方法,并返回到调用该方法的位置。
- Resume Program(恢复程序):快捷键是 “F9”。程序会从当前断点继续执行,直到遇到下一个断点或程序结束。
- Evaluate Expression(计算表达式):在调试过程中,可以通过 “Evaluate Expression” 功能计算表达式的值。在 “Variables” 窗口或代码编辑器中右键单击,选择 “Evaluate Expression”,输入要计算的表达式,IDEA 会显示计算结果。
- Step Over(单步跳过):快捷键是 “F8”。程序会执行下一行代码,如果下一行代码是方法调用,会直接执行完该方法并返回,不会进入方法内部。
实际开发断点技巧
- 条件断点:可以为断点设置条件,只有当条件满足时,程序才会在该断点处暂停。在断点上右键单击,在“Condition”的内容框中设置条件表达式。
例如,我们在这个for循环中断点,那么每次执行循环都会进入断点,我们可以通过设置断点条件来控制是否进入断点,比如只需要在 i = 10 的时候进入断点,则可以在断点处右键,在弹出的对话框的 Condition 中输入条件,如下所示
for (int i = 0; i < 100; i++) {System.out.println(i);
}
- 异常断点:IDEA 允许设置异常断点,当程序抛出特定类型的异常时,会自动暂停在抛出异常的位置。在 “Debug” 窗口中,点击 “View Breakpoints” 按钮,选择 “Java Exception Breakpoints”,可以添加要监控的异常类型。
- 多线程调试:在多线程程序中,可以通过 “Threads” 窗口方便地切换线程进行调试。还可以使用 “Suspend All” 和 “Suspend Thread” 按钮来暂停所有线程或单个线程,以便分析线程之间的交互和数据共享问题。
如果我们希望按照 线程1-1,线程2-1,线程1-2,线程2-2,线程1-3,线程2-3 的顺序输出,可以通过设置断点执行顺序来实现,具体操作如下所示。
new Thread(()->{System.out.println("线程1-1");System.out.println("线程1-2");System.out.println("线程1-3");
}).start();new Thread(()->{System.out.println("线程2-1");System.out.println("线程2-2");System.out.println("线程2-3");
}).start();
先在两个线程代码中打断点,然后在断点处右键,设置为 Thread,如下图所示
然后就可以在frame下切换线程执行了。
