IntelliJ IDEA 中不知道的调试技巧
作为一名开发人员,熟练掌握开发工具和技能是基本功。而IntelliJ 系列 IDEA 是 开发中非常流行的集成开发环境(IDE),其内置强大的调试功能,可以帮助开发者快速定位和解决问题,被广大开发者所喜爱。但是在实际开发中,接触到的一些开发人员发现他们其实并没有充分利用 IDEA 的调试功能,今天就来分享一些 IntelliJ IDEA 中常见的调试技巧。
1. 启动调试
1.1 设置断点
断点是调试的核心,它会在程序执行时暂停执行,允许你查看变量值、调用栈等信息。
设置断点:
- 在代码行的行号左侧点击,断点会显示为一个红色圆点。
- 断点可以设置在 方法内部、循环内、条件判断中 等地方。
1.2 断点类型
行断点:
- 行断点的投标就是一个红色的圆形点。在需要断点的代码行头点击即可打上。一般大多数开发者都喜欢这么玩。
方法断点:
- 方法断点就是将断点打在某个具体的方法上面,当方法执行的时候,就会进入断点。这个当我们阅读源码或者跟踪业务流程时比较有用。尤其是我们在阅读源码的时候,我们知道优秀的源码(不优秀的源码你也不会阅读)各种设计模式使用得飞起,什么策略、模板方法等等。具体要走到哪个具体得实现,还真不是猜出来,比如下面代码:
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 时加上调试参数:
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
然后在 IDEA 中配置远程调试,输入服务器的 IP 和端口。
4.3 动态修改代码(Hot Swap)
- 在调试过程中,IDEA 支持 Hot Swap 功能,允许你在不重启程序的情况下修改代码并立即生效。对于开发中需要频繁修改代码的情况非常有帮助。
5. 小结
IntelliJ IDEA 提供了强大的调试工具,包括断点调试、变量查看、线程分析、异常跟踪等多种功能。通过熟练掌握这些调试技巧,可以帮助你快速定位和修复代码中的问题。此外,合理使用日志和性能分析工具,可以使开发过程更加高效。上面只是简单的做了一下分析,如果有不对的地方,麻烦各位指正。最后,多实践、多思考才是开发人员成长的关键。希望上面分享的这些调试技巧对你有所帮助。