java断点调试(debug)

在开发中,新手程序员在查找错误时, 这时老程序员就会温馨提示,可以用断点调试,一步一步的看源码执行的过程,从而发现错误所在。
重要提示: 断点调试过程是运行状态,是以对象的运行类型来执行的

断点调试介绍

断点调试是指在程序的某一行设置一个断点,调试时,程序运行到这一行就会停住,然后你可以一步一步往下调试,调试过程中可以看各个变量当前的值,出错的话,调试到出错的代码行即显示错误,停下。进行分析从而找到这个Bug断点调试是程序员必须掌握的技能。断点调试也能帮助我们查看java底层源代码的执行过程,提高程序员的Java水平。

基本概念

  • 断点(Breakpoint):在代码中设置的特定位置,当程序运行到该位置时,会暂停执行,以便开发者检查程序的状态。
  • 调试会话(Debug Session):启动调试模式后,程序在 IDEA 的控制下运行,开发者可以通过各种调试工具与程序交互,这个过程称为调试会话。
  • 调试工具窗口:IDEA 提供了专门的调试工具窗口,用于显示调试相关的信息,如变量的值、调用栈、线程信息等。

操作步骤

  1. 设置断点:在 IDEA 的代码编辑器中,单击要设置断点的代码行左侧的空白区域,会出现一个红点,表示断点已设置。也可以通过右键单击代码行,选择 "Toggle Breakpoint" 来设置或取消断点。
  1. 启动调试 :可以通过以下几种方式启动调试会话。
    • 点击 IDEA 工具栏中的 "Debug" 按钮,选择要调试的 Java 类或启动配置。
    • 使用快捷键,如在 Windows/Linux 系统中通常是 "Shift+F9",在 Mac 系统中是 "Control+Shift+F9"。
    • 在 "Run" 菜单中选择 "Debug",然后选择相应的启动配置。
  1. 调试工具窗口 :启动调试后,IDEA 会显示调试工具窗口,主要包括以下几个部分。
    • Variables(变量):显示当前作用域内的变量及其值。可以通过双击变量来修改其值,方便进行测试和调试。
    • Call Stack(调用栈):显示方法的调用顺序,从当前执行的方法开始,向上追溯到方法的调用源头。可以点击调用栈中的方法,查看该方法调用时的上下文信息。
    • Threads(线程):显示当前正在运行的线程信息,包括线程的名称、状态等。可以在多线程程序中,方便地切换到不同的线程进行调试。
  2. 调试操作
    • 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 会显示计算结果。

实际开发断点技巧

  • 条件断点 :可以为断点设置条件,只有当条件满足时,程序才会在该断点处暂停。在断点上右键单击,在"Condition"的内容框中设置条件表达式。

例如,我们在这个for循环中断点,那么每次执行循环都会进入断点,我们可以通过设置断点条件来控制是否进入断点,比如只需要在 i = 10 的时候进入断点,则可以在断点处右键,在弹出的对话框的 Condition 中输入条件,如下所示

java 复制代码
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 的顺序输出,可以通过设置断点执行顺序来实现,具体操作如下所示。

java 复制代码
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下切换线程执行了。

相关推荐
Grey Zeng4 小时前
Java SE 25新增特性
java·jdk·jdk新特性·jdk25
雨白5 小时前
Java 线程通信基础:interrupt、wait 和 notifyAll 详解
android·java
架构师沉默10 小时前
设计多租户 SaaS 系统,如何做到数据隔离 & 资源配额?
java·后端·架构
Java中文社群11 小时前
重要:Java25正式发布(长期支持版)!
java·后端·面试
每天进步一点_JL12 小时前
JVM 类加载:双亲委派机制
java·后端
用户2986985301413 小时前
Java HTML 转 Word 完整指南
java·后端
渣哥13 小时前
原来公平锁和非公平锁差别这么大
java
渣哥13 小时前
99% 的人没搞懂:Semaphore 到底是干啥的?
java
J2K13 小时前
JDK都25了,你还没用过ZGC?那真得补补课了
java·jvm·后端
kfyty72513 小时前
不依赖第三方,不销毁重建,loveqq 框架如何原生实现动态线程池?
java·架构