idea篇3:debug功能

一、功能

1、Show Execution Point

快捷键:Alt + F10

回到当前激活的断点处;当你的鼠标不在断点所处的行,点击之后,会立马复位到断点处;

2、Step Ove

快捷键:F8

单步调试;逐行往下执行,如果执行行有其他方法,不会进入对应的方法;日常Debug用的最多的一个功能

3、Step Into

快捷键:F7

进入方法体内部。该功能会进入自定义的方法或者三方库的方法;注意,不会进入JDK的方法;

 

4、Force Step Into

快捷键:Alt + Shift + F7

强制进入方法体内部,与Step Into不同的是,会进入JDK的方法;

 

5、Step Out

快捷键:Shift + F8

跳出方法体;一般会配合(Force)Step Into一起使用

6、Drop frame

回到方法的调用处,同时上下文内所有的变量的值也回到那个时候。

该按钮能够点击的前提条件是:当前所处的方法有上级方法,如果你是main方法里,那么按钮就是灰色,无法点击;

 

7、Run to Cursor

快捷键:Alt + F9

将代码运行到光标处,光标停在哪里就运行到哪里;

 

8、Evaluate Expression

快捷键:Alt + F8

表达式计算器;可执行任意合法的表达式。

 

9、Trace Current Stream Chain

追踪当前Stream流;只有在Stream代码上,此按钮才会亮起。

 

10、Rerun Main

快捷键:Ctrl + F5

重新执行Debug;

11、Resume Program

快捷键:F9

恢复程序;当因为断点导致代码停止之后,此功能可以让持续恢复执行;有下一个断点时,会跳转到下一个断点;没有下一个断点,会执行到持续结束;

12、Stop Main

快捷键:Ctrl + F12

停止程序;

13、View Breakpoints

快捷键:Ctrl + Shift + F8

打开断点管理窗口;

14、Mute Breakpoints

停用所有的断点;

15、Get Thread Dump

拿到当前线程的Dump,可以查看当前线程的状态;

16、筛选

 

二、技巧

1、行断点

行断点的图标是一个 圆形的红点,在需要断点的代码行头点击,即可添加断点

2、方法测试

接口Service有两个具体的实现:ServiceAServiceB,分别实现了接口的method方法,调试的过程中就可以将断点打在接口的method方法上;当我们在Main方法中实例化了ServiceB,断点就自动进入到ServiceB的method()方法了;

更多功能(鼠标右键)

 

  • Condition

    用于输入表达式,进行过滤

  • Watch

    • Emulated

      用于提高调试性能

    • Method entry

      进入方法时激活断点

    • Method exit

      退出方法时激活断点

    Method entry 和 Method exit 至少有一个选项存在。

3、属性断点

在属性的行头点击即可添加一个小眼睛一样的属性监听断点,用于监听某个属性的读写变化过程;

 

4、模拟异常

开发过程中,有时候需要人为制造一些异常,比如事务操作(@Transactional),需要验证是否能达到回滚的效果;

比如下面的伪代码:

// 伪代码 假如这里是个事务操作
// @Transactional
public void save() throws RuntimeException{
    table1Save();
    // 我先在这里测试一下,异常之后,是否会滚
    //throw new RuntimeException("异常了");
    table2Save();
    table3Save();
}

void table1Save(){}
void table2Save(){}
void table3Save(){}

当咱希望在执行table2Save()的时候,抛个异常,让整个操作回滚,通常的做法是会在代码中人为抛一个异常:

throw new RuntimeException("异常了");

这样做并没有什么错,但是不是很优雅,而且还存在一下的两个问题:

  • 只能在方法的末尾抛异常;流程中间抛,后面的代码会报错
  • 有风险,这种业务功能中人为抛异常,如果一不小心忘记删除,将这个异常提交上去,就是人为的生产事故,可能带来比较严重的后果;

IDEA优雅模拟异常
那有没有什么更好的方式呢?IDEA给我们提供了更加优化的模拟异常方案,操作步骤如下:

操作步骤:

  • 第一步,在要模拟异常的地方加上断点;
  • 第二步,Debug模式运行代码并进入断点;
  • 第三步,Frames中找到对应的断点记录;
  • 第四步,右键,选择Throw Execption
  • 第五步,输入你想抛出的异常,点击ok,即可抛出对应的异常;

5、多线程调试

多线程开发的时候,线程的调度策略并不由代码控制,导致断点调试的过程可能会在线程间跳来跳去,如果逻辑复杂点,跳着跳着可能就蒙蔽了;如下示例:

public class Main {
    public static void main(String[] args) {
        System.out.println("0 main start");
        new Thread(() -> {
            System.out.println("1 hello");
        }, "thread1").start();

        new Thread(() -> {
            System.out.println("2 world");
        }, "thread2").start();

        System.out.println("3 main end");
    }
}

 

如果把断点打在System.out.println上,除了0是能保证第一个输出的,1、2、3的执行顺序是没办法保证的;

默认情况下,断点的suspend设置是all,顺序并不固定;

如果将所有断点的suspend设置为Thread之后,就会按着线程的顺序,逐个去执行: 

6、修改变量

在断点的过程中去修改某个变量的值;常见的场景是:当某个变量,以为逻辑bug导致其值和预期的不一样,但是又不想从头再进行debug,就可以直接在调试的过程中去修改变量的值,并继续执行后续的流程;

 

7、远程调试

非常实用且特别装B的一个技能,当线上代码出现Bug之后,可以通过此方式进行远程调试,快速定位问题并修复;

注意:远程调试必须保证本地代码和线上代码版本一致,否则不会进入断点

设置步骤如下:

 添加一个用于远程调试的接口

@RestController
public class RemoteDebugController {
    @GetMapping("debug")
    public Integer debug(Integer p){
        System.out.println(p);
        return p;
    }
}

将代码打成jar包

mvn clean package -Dmaven.test.skip=true

IDEA 设置远程配置

 

以下时几个重要参数的说明

Name

名称,不重要,随意填写;

Host

远端项目的IP,这里是本机测试,所以填写127.0.0.1即可,实际使用填写远端服务所在的IP地址

PORT

远端调试的端口

远端服务运行时的JVM参数

IDEA 工具帮我们生成的服务运行时需要添加的JVM参数,直接复制使用即可;
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5555
 

启动项目

为了演示,这里就不在IDEA中启动了,直接在CMD窗口下启动测试项目

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5555 -jar spring-boot-001-hello-world-0.0.1-SNAPSHOT.jar

 

启动过程出现socket的监听日志,说明正常

Listening for transport dt_socket at address: 5555

IDEA 远程调试配置

 

测试

  • 左侧为jar包运行的控制台

  • 右上方为IDEA的界面

  • 右下方为浏览器,模拟客户端请求;

如下图示:

 

 

8、更多功能

 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值