Code Ease Code Ease
  • 个人博客网站 (opens new window)
  • 好用的工具网站 (opens new window)
  • Java核心基础
  • 框架的艺术
  • 分布式与微服务
  • 开发经验大全
  • 设计模式
  • 版本新特性
数据库系列
大数据+AI
  • xxl-job
运维与Linux
  • 基于SpringBoot和BootStrap的论坛网址
  • 基于VuePress的个人博客网站
  • 基于SpringBoot开发的小功能
  • 做一个自己的IDEA插件
程序人生
关于我
  • 分类
  • 标签
  • 归档

神秘的鱼仔

你会累是因为你在走上坡路
  • 个人博客网站 (opens new window)
  • 好用的工具网站 (opens new window)
  • Java核心基础
  • 框架的艺术
  • 分布式与微服务
  • 开发经验大全
  • 设计模式
  • 版本新特性
数据库系列
大数据+AI
  • xxl-job
运维与Linux
  • 基于SpringBoot和BootStrap的论坛网址
  • 基于VuePress的个人博客网站
  • 基于SpringBoot开发的小功能
  • 做一个自己的IDEA插件
程序人生
关于我
  • 分类
  • 标签
  • 归档
服务器
  • Java核心基础

  • 框架的艺术

  • 分布式与微服务

  • 开发经验大全

    • 如何用Java写一个规范的http接口?
    • 一个成熟的Java项目如何优雅地处理异常
    • 项目经理最近感觉系统慢了,想知道整个系统每个方法的执行时间
    • 财务说账单上少了一分钱,老板看到代码气疯了
    • 浅析五种最常用的Java加密算法,以后可以直接拿来用了
    • 你真的会用idea进行debug吗?idea实用debug教程
      • (一)引言
      • (二)调试按钮介绍
      • (二)断点类型介绍
        • 2.1 普通断点
        • 2.2 详细断点
        • 2.3 方法断点
        • 2.4 异常断点
        • 2.5 监控断点
      • (三)多线程断点
      • (四)总结
    • 还不知道项目中怎么写日志?slf4j+log4j帮你搞定!
    • 如何在工作中快速上手Git
    • 号称"最强API文档工具"的Swagger到底厉害在哪
    • 分享工作一年后收藏的超好用Idea插件,工作效率直接翻倍
    • 怎样才能写出规范的好代码?
    • 如何上传自己的jar包到maven中央仓库(2021最新版)
    • 使用Optional更优雅地处理非空判断
    • 查准考证网站卡了整整一个小时进不去,被抢票支配的恐惧又来了
    • 线上报了内存溢出异常,又不完全是内存溢出
  • 版本新特性

  • Java
  • 开发经验大全
CodeEase
2023-10-24
目录

你真的会用idea进行debug吗?idea实用debug教程

作者:鱼仔
博客首页: codeease.top (opens new window)
公众号:Java鱼仔

# (一)引言

解决一眼无法发现的代码问题有两种方式最靠谱,第一种是查日志,第二种就是dubug。但是我发现很多程序员只会打上一个最简单的普通断点,这可完全没有发挥出idea的强大,这一期就带来我认为idea中最实用的debug教程。

# (二)调试按钮介绍

打开debug模式后可以看到下面这些按钮,我接下来一个个介绍:

1、Show Execution Point (Alt + F10):跳回到当前代码执行的行

2、Step Over(F8):一行行往下走,不会进入方法内部。

3、Step Into(F7):如果当前行有方法,则进入方法内部。注意:一般用于进入自定义方法,不会进入官方类库的方法。

4、Force Step Into(Alt+Shift+F7):和Step Into的区别在于能进入任何方法。

5、Step Out(Shift+F8):从Step Into的方法内退出到方法的调用处,方法执行完毕。

6、Drop Frame:回退到上一个方法调用的地方

7、Run to Cursor(Alt+F9):运行到光标定位处

8、Evaluate Expression(Alt+F8):计算表达式,可以计算出运行到当前的变量或者表达式的值,调试时很方便。

1、Rerun:重新运行程序。

2、Resume Program (F9):运行到下一个断点或者直接结束(如果下一个没有断点了)。

3、Pause Program:暂停程序。

4、Stop(Ctrl+F2):关闭程序

5、View Breakpoints (Ctrl + Shift + F8):查看所有的断点

6、Mute BreakPoints:选中后可以让断点失效

# (二)断点类型介绍

# 2.1 普通断点

最常用的断点类型,直接序号栏的右侧左键即可打上,开启debug模式后会停留在最先遇到的断点上。

# 2.2 详细断点

Shift+左键可以调出详细断点,所谓详细断点,就是对断点的一些配置,比如是否启用(Enabled)、阻断范围(Suspend)、条件(Condition)、日志输出(Log)等。这是普通断点的升级用法,在普通断点处右键也可以展开这个页面。

# 2.3 方法断点

所谓方法断点就是打在方法上的断点,它的形状和普通断点不同,是个菱形。方法断点会在运行到这个方法后和离开方法前停下,可以用来测试某个方法的数据。另外如果方法断点打在接口方法上,会自动进入接口方法的实现类中。

# 2.4 异常断点

异常断点是很实用的一个断点,通过设置异常断点可以自动让程序在异常处停下来,首先打开View Breakpoints(Ctrl + Shift + F8),不记得的话看上面的调试按钮介绍。点击加号选择Java Exception BreakPoints。

输入异常的类型后会自动加到异常断点列表中

查看结果,会停留在第一个遇到的异常处。另外说一句下面这种空指针异常,如果把代码改成"aaa".equals(name)就可以防止出现空指针异常。

# 2.5 监控断点

我们可以监控某个变量值的变化,这种断点叫做监控断点,监控断点是打在变量上的,它的形状像一个眼睛。

运行代码,通过Resume Program (F9),他会在每次name值改变的时候停下来。

# (三)多线程断点

我们平常打的断点一般都是阻塞整个程序运行的,在调试多线程时就不方便,idea也提供了只阻塞当前线程的断点。首先写一段简单的多线程代码,代码实现的内容为:两个线程均每隔一秒输出一次线程名称和执行了几秒

public class MultiThreadBreakPoint {
    public static void main(String[] args) {
        //第一个线程运行
        new Thread(()->{
            int i=0;
            while (true){
                System.out.println(Thread.currentThread().getName()+":"+i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                i++;
            }
        }).start();
        //第二个线程运行
        new Thread(()->{
            int i=0;
            while (true){
                System.out.println(Thread.currentThread().getName()+":"+i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                i++;
            }
        }).start();
        System.out.println("我是主线程");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

接着无论在代码的任何位置(主线程、线程1和线程2)打上普通断点,debug时都会阻塞整个程序。

现在介绍多线程断点,只要把详细断点(或者在普通断点右键)中的Suspend设置为Thread,这个断点就只会阻塞当前线程。

现在我在主线程中打上线程断点,主线程被阻塞了,但是另外两个线程还在运行中:

因此我们可以做到在每个子线程中打上线程断点,然后在Frame中选择调试哪个线程,就可以做到自己决定不同线程的执行顺序,很方便复现多线程问题。

# (四)总结

断点调试是一个程序员必须要掌握的技能,学习成本低,20分钟基本学会,但是作用却很大。我是鱼仔,下期聊聊解决代码问题的另外一种工具----日志!

上次更新: 2025/02/18, 11:30:08
浅析五种最常用的Java加密算法,以后可以直接拿来用了
还不知道项目中怎么写日志?slf4j+log4j帮你搞定!

← 浅析五种最常用的Java加密算法,以后可以直接拿来用了 还不知道项目中怎么写日志?slf4j+log4j帮你搞定!→

最近更新
01
AI大模型部署指南
02-18
02
半个月了,DeepSeek为什么还是服务不可用
02-13
03
Python3.9及3.10安装文档
01-23
更多文章>
Theme by Vdoing | Copyright © 2023-2025 备案图标 浙公网安备33021202002405 | 浙ICP备2023040452号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式