素材巴巴 > 程序开发 >

IDEA常用的Debug技巧

程序开发 2023-09-15 22:50:51

文章目录

  • 2.3 重新执行
  • 2.4 跳到下一断点
  • 3. 按钮和快捷键说明
  • 4. 断点
  • 5. 降帧
  • 6. 断点条件
  • 7. 强制返回
  • 8. Stream调试
  • 9. 执行表达式
  • 10. 多线程调试
  • 1. 概述

    IDEA是Java程序员必备的IDE,非常强大的功能,搭配很多插件的时候就可以增强它的功能,开发出现异常的时候利用好Debug可以做到排查问题可以事半功倍。

    2. 如何使用Debug ?

    2.1 打断点

    断点:指可以让程序中断(暂停)的地方,方便进行调试分析👍。

    在行号右边“点击”,出现红色圆点即可打上断点。

    在这里插入图片描述

    2.2 开启Debug模式

    2.2.1 单元测试下

    开启Debug模式运行

    在这里插入图片描述

    2.2.2 SpringBoot应用下

    开启调试模式

    在这里插入图片描述

    2.3 重新执行

    点击如下按钮,即可重新运行调试。

    在这里插入图片描述

    2.4 跳到下一断点

    点击如下按钮可以跳到,下一断点处。

    在这里插入图片描述

    3. 按钮和快捷键说明

    3.1 横排按钮(从左往右,偏向定位)

    在这里插入图片描述
    详细说明:

    按钮功能快捷键说明Show Execution PointAlt + F10如果你的光标在其它行或其它页面,点击这个按钮可跳转到当前代码执行的行。Step Over步过F8一行一行地往下走,如果这一行上有方法不会进入方法。Step Into步入F7如果当前行有方法,可以进入方法内部,一般用于进入自定义方法内,不会进入官方类库的方法。Force Step Into强制步入Alt + Shift + F7能进入任何方法,查看底层源码的时候可以用这个进入官方类库的方法。Step Out步出Shift + F8从步入的方法内退出到方法调用处,此时方法已执行完毕,只是还没有完成赋值。Drop Frame回退断点Run to Cursor运行到光标处Alt + F9将光标定位到你需要查看的那一行,然后使用这个功能,代码会运行至光标行,而不需要打断点。Evaluate Expression计算表达式Alt + F8打开计算表达式面板

    3.2 竖排按钮(从上往下,偏向过程)

    在这里插入图片描述

    按钮说明

    按钮功能快捷键说明Rerun ‘xxxx’重新运行重新运行程序,会关闭服务后重新启动程序。Resume Program恢复程序F9跳到下一个断点,都是按照断点维度来跳。Pause Program暂停程序暂停程序,启用Debug。Stop ‘xxx’关闭程序Ctrl + F2连续按两下,关闭程序。有时候你会发现关闭服务再启动时,报端口被占用,这是因为没完全关闭服务的原因,你就需要查杀所有JVM进程了。View Breakpoints查看所有断点Ctrl + Shift + F8查看所有断点Mute Breakpoints哑的断点选择这个后,所有断点变为灰色,断点失效,按F9则可以直接运行完程序。再次点击,断点变为红色,有效。如果只想使某一个断点失效,可以在断点上右键取消Enabled

    4. 断点

    4.1 行断点

    在对应的代码行号上添加端点,可以在断点所在行进行暂停。

    4.2 方法断点

    功能
    在方法入口(entry)和出口(exit)都会自动暂停。在方法入口暂停可以让我们从头调试整个方法,而在方法出口处暂停可以让我们看到方法执行完毕时,方法内各个变量的数据情况。

    有时候我们的一个接口会存在很多实现类,我们短时间内难以分析究竟是运行到了哪个实现类中,这个时候就可以使用方法断点,我们将断点打在接口方法上,运行到该方法时,会自动跳到实际执行的实现类,无需通过上下文环境去分析是哪个实现类。

    在方法名所在的行打上断点

    在这里插入图片描述

    点击“方法断点”按右键,弹出设置选项

    在这里插入图片描述

    4.3 字段断点

    功能

    在字段发生变更(默认)或者被访问(需要额外设置)时暂停。

    如果我们想知道某个属性在什么时候被修改,从入口处开始调试太麻烦,我们可以直接在字段上打上字段断点,这样字段被修改的时候就会自动暂停。

    在类属性行上添加的断点
    在这里插入图片描述

    点击“字段断点”右击弹出监听配置:

    在这里插入图片描述

    4.4 异常断点

    功能

    可以在抛出异常的地方进行暂停

    异常断点是无需在具体的代码上打断点的,而是在断点详情页中直接添加,后续在执行时,如果抛出我们监听的异常,则会自动暂停在抛出异常的地方。

    在这里插入图片描述

    产生的异常断点如下:

    在这里插入图片描述

    5. 降帧

    功能
    当我们 Debug 从 A 方法进入 B 方法时,通过降帧(退帧)可以返回到调用 B 方法前,这样我们就可以再一次调用 B 方法。
    通常用于当我们快执行完 B 方法后,发现某个重要流程被我们跳过了,想再看一下,则此时可以先回退到 A 方法,然后再次进入 B 方法。

    我们知道方法的执行和结束在 JVM 中对应的是栈帧的入栈和出栈,因此栈帧描述的就是方法对应的模型,而降帧(退帧)则对应的就是回退到上一个方法。

    案例:
    在单元测试内部调用service的getSalary()方法时,getSalary()内部有两个断点,最终停留在第50行的断点的时候,步出和退帧的区别在于:

    在这里插入图片描述
    在这里插入图片描述

    6. 断点条件

    功能

    当程序执行到断点位置时,需要 Condition 中的表达式返回 true,才会暂停,否则会直接跳过。

    用于断点所在的地方执行次数过多时,避免浪费时间在不想关注的流程上。例如我们有一个 Spring bean 的初始化存在问题,我们想跳过其他 bean 的初始化流程,则可以在初始化的入口设置 beanName.equals(“”) 表达式,来达到只在我们关注的 bean 执行时才暂停。

    添加断点条件
    在这里插入图片描述

    查看断点处的变量值:

    在这里插入图片描述

    7. 强制返回

    功能

    强制结束当前程序运行流程,直接返回。

    在这里插入图片描述

    在这里插入图片描述

    8. Stream调试

    功能

    当我们暂停在 Stream 的处理代码行时,可以将 Stream 的整个处理流程以图形化界面的形式展示。

    在这里插入图片描述

    9. 执行表达式

    功能

    用于执行一段我们实时写的代码,例如查看数据、修改数据。

    在这里插入图片描述

    当我们在测试时,发现某段代码逻辑很难有符合条件的数据时,可以通过该功能直接修改数据,来加快我们的测试。

    该功能非常强大,我们可以在这边执行任何逻辑,举个例子:可以将数据保存到数据库、可以发送一个RPC请求等等。

    10. 多线程调试

    Suspend 有两种模式:All 和 Thread。

    
     @Testpublic void testThreadsBreakPoints() throws InterruptedException {new Thread(() -> {System.out.println("线程 1 start...");System.out.println("线程 1 end!");}).start();new Thread(() -> {System.out.println("线程 2 start...");System.out.println("线程 3 end!");}).start();System.out.println("主线程 end");Thread.sleep(10000);}

    Thread模式下

    通过输出内容,可以看到线程1被阻塞,线程2和主线程都已经执行结束

    在这里插入图片描述

    All模式下

    可以看到线程2和主线程没有使用断点,但是也被暂停了,因为没有输出内容。
    在这里插入图片描述

    参考文档:

    https://blog.csdn.net/qq_43102730/article/details/125252811


    标签:

    素材巴巴 Copyright © 2013-2021 http://www.sucaibaba.com/. Some Rights Reserved. 备案号:备案中。