Skip to content

IntelliJ IDEA 中不知道的调试技巧

作为一名开发人员,熟练掌握开发工具和技能是基本功。而IntelliJ 系列 IDEA 是 开发中非常流行的集成开发环境(IDE),其内置强大的调试功能,可以帮助开发者快速定位和解决问题,被广大开发者所喜爱。但是在实际开发中,接触到的一些开发人员发现他们其实并没有充分利用 IDEA 的调试功能,今天就来分享一些 IntelliJ IDEA 中常见的调试技巧。

1. 启动调试

1.1 设置断点

断点是调试的核心,它会在程序执行时暂停执行,允许你查看变量值、调用栈等信息。

设置断点:

  • 在代码行的行号左侧点击,断点会显示为一个红色圆点。
  • 断点可以设置在 方法内部、循环内、条件判断中 等地方。

1.2 断点类型

行断点:

  • 行断点的投标就是一个红色的圆形点。在需要断点的代码行头点击即可打上。一般大多数开发者都喜欢这么玩。

方法断点:

  • 方法断点就是将断点打在某个具体的方法上面,当方法执行的时候,就会进入断点。这个当我们阅读源码或者跟踪业务流程时比较有用。尤其是我们在阅读源码的时候,我们知道优秀的源码(不优秀的源码你也不会阅读)各种设计模式使用得飞起,什么策略、模板方法等等。具体要走到哪个具体得实现,还真不是猜出来,比如下面代码:
java

public interface Service {
    void test();
}

public class ServiceA implements Service{
    @Override
    public void test() {
        System.out.println("ServiceA");
    }
}


public class ServiceB implements Service{
    @Override
    public void test() {
        System.out.println("ServiceB");
    }
}


public class ServiceC implements Service{
    @Override
    public void test() {
        System.out.println("ServiceC");
    }
}


public class DebugTest {
    public static void main(String[] args) {
        Service service = new ServiceA();
        service.test();
    }
}

在运行时,你怎么知道他要进入哪个类的 test() 方法呢?有些小伙伴可能就会在 ServiceA、ServiceB、ServiceC 中都打断点,这样就可以知道进入哪个了。其实我们可以直接在接口 Service  的 test() 方法上面打断点,这样也是可以进入具体的实现类的方法.当然,也可以在方法调用的地方打断点,进入这个断点后,按 F7 就可以了。

属性断点:

  • 属性断点是打在某个具体的属性上面,当属性被修改时,会暂停执行。
  • 这样就可以监听这个属性的读写变化过程。

在我们的项目中经常要追踪某个报表对应的指标值变化(在Java中就是一个对象的属性值),因此在对应属性上打上断点就能追踪到这个属性值的变化。

条件断点:

  • 右击断点,选择 条件,可以设置条件表达式,当条件为真时,才会暂停执行。
  • 条件断点是非常有用的一个断点技巧,对于我们调试复杂的业务场景,尤其是 for、if 代码块时,可以节省我们很多的调试时间。(亲眼见过一个小伙伴在 for 循环中打断点,然后每次循环都进入,然后就懵逼了...)

1.3 启动调试

通过调试运行:点击工具栏中的 绿色调试按钮(虫子图标),或者使用快捷键 Shift + F9。 选择调试配置:你可以选择使用现有的运行配置或创建一个新的调试配置。配置的类型包括 应用程序、JUnit 测试、Spring Boot 应用 等。

2. 调试过程中常见操作

在调试过程中,你可以使用以下功能进行代码控制和检查。

2.1 控制代码执行

  • 继续(Resume Program):按 F9 或点击工具栏中的 继续按钮,程序将继续执行直到下一个断点。
  • 步入(Step Into):按 F7 或点击 步入按钮,进入当前代码行的调用方法中。如果当前行是方法调用,将跳转到方法内部。
  • 步过(Step Over):按 F8 或点击 步过按钮,跳过当前行的代码,继续执行到下一个断点。适用于不想深入查看的代码。
  • 跳出(Step Out):按 Shift + F8 或点击 跳出按钮,执行完当前方法并跳回到调用该方法的地方。

2.2 查看变量

  • 查看局部变量:调试时,IDE 会显示 当前方法 的局部变量值,默认在底部的 Variables 面板中。
  • 查看字段(Field):在类中声明的字段可以通过 Variables 面板查看,或使用 Alt + F7 查找变量的定义。
  • 查看表达式:在调试时,使用 Evaluate Expression(Alt + F8) 输入表达式查看值,方便临时计算或验证某些值。

2.3 监视变量变化

  • 监视窗口:右击某个变量或字段,选择 Add to Watches,将其添加到 Watches 面板,这样可以实时查看它的值变化。
  • 变量高亮:在代码中,IDE 会高亮显示当前调试时的变量,方便快速跟踪。

3. 调试优化技巧

3.1 异常跟踪

  • Exception Breakpoint(异常断点):IDEA 提供了 异常断点 功能,能在程序抛出指定的异常时暂停执行。你可以设置在所有异常或特定异常上打断。
  • 右键点击 Breakpoints 面板并选择 Add Exception Breakpoint。
  • 设置触发条件(例如捕获 NullPointerException)。

3.2 调试多线程

  • 查看线程:在 Threads 面板中,你可以看到所有线程的状态和堆栈信息。 线程切换:调试过程中,可以手动切换线程,查看每个线程执行的代码。 线程断点:你可以设置 线程断点,当某个线程执行到特定位置时暂停。

3.3 使用日志

  • 在程序中可以使用 Logger 输出日志,然后通过查看 Console 面板实时查看输出。对于一些间歇性问题,调试日志可能是解决问题的好方法。

3.4 调试启动参数

  • 配置调试参数:在 IDEA 中可以配置程序启动的 VM 参数 和 环境变量,方便调试时修改程序的启动行为。
  • 在 Run/Debug Configurations 中选择你的配置。 在 VM options 中添加参数,如 -Xmx512m,或设置环境变量。

3.5 调试 Stream

Java 中的 Stream 好用是好用,但是依然有一些小伙伴不怎么使用它,最大的一个原因就是它不好调试。你利用 Stream 处理一个 List 对象后,发现结果不对,但是你很难判断到底是哪一行出来问题。

  • 其实 IDEA 是支持调试 Stream 的,你只需要在 Stream 处理的地方打上断点,选择Trace Current Stream Chanin 然后就可以看到 Stream 处理的整个过程。

4. 进阶技巧

4.1 使用 Profiler 进行性能调试

Profiler 可以帮助你分析程序的性能瓶颈,通过 CPU Profiling 和 Memory Profiling,查看各个方法的执行时间和内存占用。

  • 在 IDE 中点击 Run > Profile 启动性能分析。
  • 查看 CPU 使用情况,内存泄漏,并定位瓶颈。

4.2 远程调试

  • 远程调试:你可以在本地使用 IDEA 连接到远程服务器上的 JVM,进行调试。只需在远程服务器启动 JVM 时加上调试参数:
bash
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005

然后在 IDEA 中配置远程调试,输入服务器的 IP 和端口。

4.3 动态修改代码(Hot Swap)

  • 在调试过程中,IDEA 支持 Hot Swap 功能,允许你在不重启程序的情况下修改代码并立即生效。对于开发中需要频繁修改代码的情况非常有帮助。

5. 小结

IntelliJ IDEA 提供了强大的调试工具,包括断点调试、变量查看、线程分析、异常跟踪等多种功能。通过熟练掌握这些调试技巧,可以帮助你快速定位和修复代码中的问题。此外,合理使用日志和性能分析工具,可以使开发过程更加高效。上面只是简单的做了一下分析,如果有不对的地方,麻烦各位指正。最后,多实践、多思考才是开发人员成长的关键。希望上面分享的这些调试技巧对你有所帮助。

Released under the MIT License.