# Idea 调试 Debug 技巧

article/2025/10/15 2:13:19

Idea 调试 Debug 技巧

  • IDEA 为我们提供了很多简单且非常强大的调试功能

  • 在需要调试的行打上断点,debugger 方式启动Idea 控制台如下
    在这里插入图片描述

调试功能说明

Show Execution Point

  • 快捷键:Alt + F10
  • 回到当前激活的断点处:当你的鼠标不在断点所处的行,点击之后,会立马复位到断点处;
    在这里插入图片描述

Step Over

  • 快捷键:F8
  • 单步调试:逐行往下执行,如果执行行有其他方法,不会进入对应的方法;日常Debug用的最多的一个功能。
    在这里插入图片描述

Step Into

  • 快捷键:F7
  • 进入方法体内部。该功能会进入自定义的方法或者三方库的方法,不会进入JDK的方法
    在这里插入图片描述

Force Step Into

  • 快捷键:Alt + Shift + F7
  • 强制进入方法体内部,与Step Into不同的是,会进入JDK的方法;
    在这里插入图片描述

Step Out

  • 快捷键:Shift + F8
  • 跳出方法体;一般会配合(Force)Step Into一起使用
    在这里插入图片描述

Drop frame

  • 回到方法的调用处,同时上下文内所有的变量的值也回到那个时候。
  • 该按钮能够点击的前提条件是:当前所处的方法有上级方法,如果你是main方法里,那么按钮就是灰色,无法点击;
    在这里插入图片描述

Run to Cursor

  • 快捷键:Alt + F9
  • 将代码运行到光标处,光标停在哪里就运行到哪里;
    在这里插入图片描述

Evaluate Expression

  • 快捷键:Alt + F8
  • 表达式计算器;可执行任意合法的表达式。
    在这里插入图片描述

Trace Current Stream Chain

  • 追踪当前Stream流;只有在Stream代码上,此按钮才会亮起。
    在这里插入图片描述

Rerun Main

  • 快捷键:Ctrl + F5
  • 查询执行Debug
    在这里插入图片描述

Resume Program

  • 快捷键:F9
  • 恢复程序;当因为断点导致代码停止之后,此功能可以让持续恢复执行;有下一个断点时,会跳转到下一个断点;没有下一个断点,会执行到持续结束;
    在这里插入图片描述

Stop Main

  • 快捷键:Ctrl + F12
  • 停止程序;
    在这里插入图片描述

View Breakpoints

  • 快捷键:Ctrl + Shift + F8
  • 打开断点管理窗口;
    在这里插入图片描述

Mute Breakpoints

  • 停用所有的断点;
    在这里插入图片描述

Get Thread Dump

  • 拿到当前线程的Dump,可以查看当前线程的状态;
    在这里插入图片描述

筛选

在这里插入图片描述

调试小技巧

行断点

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

方法断点

  • 将断点打在某个具体的方法上,方法执行的时候,会进入断点;
  • 举个方法调试最常用的Debug场景:当阅读源码或者自己写业务需求的时候,经常会用到策略、模板方法等设计模式;在调试的时候,需要知道,当前接口方法或者抽象方法的执行,到底是走的哪一个具体的实现,用方法调试就能很方便的找到;如下示例;
    在这里插入图片描述
    请添加图片描述
  • 接口Service有两个具体的实现:ServiceAServiceB,分别实现了接口的method方法,调试的过程中就可以将断点打在接口的method方法上;当我们在Main方法中实例化了ServiceB,断点就自动进入到ServiceBmethod()方法了;
  • 接口Service
public interface Service {void method();
}
  • ServiceA
public class ServiceA implements Service{@Overridepublic void method() {System.out.println("Service A");}
}
  • ServiceB
public class ServiceB implements Service{@Overridepublic void method() {System.out.println("Service B");}
}
  • Main
public class Main {public static void main(String[] args) {Service serviceB = new ServiceB();serviceB.method();}
}

更多功能点

在这里插入图片描述

  • Condition:用于输入表达式,进行过滤
  • WatchMethod entryMethod exit 至少有一个选项存在。
  • Emulated:用于提高调试性能
  • Method entry:进入方法时激活断点
  • Method exit:退出方法时激活断点

属性断点

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

更多功能点

在这里插入图片描述

  • Condition
    用于输入表达式,进行过滤
  • Watch
  • Filed Access:读取此属性时(写入时不管)
  • Filed modification:写入此属性时(读取时不管)

异常断点

  • 异常断点是开发、调试的时候经常用到的一个功能,用于快速定位到那行代码出现了异常;
    请添加图片描述
    设置方式:
  • 第一步,使用快捷键Ctrl + Shift + F8打开配置窗口;
  • 第二步,点击左上角的+号;
  • 第三步,选择Java Exception Breakpoints
  • 第四步,添加需要断点的异常,如:ArithmeticException
  • 第五步,Debug运行,当出现指定的异常时,就会进入断点;

更多功能点

在这里插入图片描述

  • Condition:用于输入表达式,进行过滤
  • Watch
  • Caught excetion:只有当你自己try-catch了这个异常才会激活断点
  • Uncaught excetion:只有当你自己不try-catch时才会激活断点

临时断点

  • 临时断点是指只触发一次的断点,之后就自动取消了;一般用于特定的场合下需要确认值是符合我们的预期,完了之后就不在需要了;
  • 设置及演示过程如下:
    请添加图片描述
    设置方式:
  • 第一步,设置断点
  • 第二步,使用快捷键Ctrl + Shift + F8打开配置窗口;
  • 第三步,找到对应的断点;
  • 第四步,勾选Remove once hit
  • 第五步,Debug运行,当断点触发一次之后,就自动取消了;

断点条件

  • 设置断点的触发条件,也是阅读源码、修复Bug经常用到的一个功能,比如读Spring源码,研究Bean生命周期的时候,就可以根据Beanname去设置断点条件,用来判断之后在操作指定对象的时候,才进入断点;
  • 如下示例:
    1、 for循环之后只有i2的倍数时,才进入断点,可以在Conditon中填入i % 2 == 0
    2、 0-10000的循环,当i等于5000的时候,进入断点,其他的时候忽略,可以在Conditon中填入i == 5000
    请添加图片描述
    设置过程:
  • 第一步,设置断点
  • 第二步,右键断点处,打开操作界面
  • 第三步,输入表达式,比如循环时只有偶数才断点,可以输入i % 2 == 0

模拟异常

开发过程中,有时候需要人为制造一些异常,比如事务操作(@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,即可抛出对应的异常;

多线程调试

  • 多线程开发的时候,线程的调度策略并不由代码控制,导致断点调试的过程可能会在线程间跳来跳去,如果逻辑复杂点,跳着跳着可能就蒙蔽了;如下示例:
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之后,就会按着线程的顺序,逐个去执行:
    请添加图片描述

修改变量

  • 在断点的过程中去修改某个变量的值;常见的场景是:当某个变量,因为逻辑bug导致属性值和预期的不一样,但是又不想从头再debug一遍,就可以直接在调试的过程中修改成预期的值,并继续执行后续的步骤;
    请添加图片描述

断点执行代码/方法/表达式

断点过程中,可以执行一段表达式、代码或者方法

  • 代码
    请添加图片描述
  • 方法执行
    请添加图片描述
  • 表达式
    请添加图片描述

更多功能

  • 上面列举了绝大部分常用的Debug功能,但是这并不是所有的,一些不常用功能可以根据需要选择使用
    在这里插入图片描述

远程调试

  • 非常实用且特别装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的界面;右下方为浏览器,模拟客户端请求;
    如下图示:
    请添加图片描述
  • 当客户端发起请求的时候,IDEA就会进入断点,当执行通过,可以看出,左侧控制台就会打印出对应的日志;
  • 线上调试,务必要给断点加上条件,比如特定测试账号才进去断点;避免让真是用户的请求也进入断点,影响用户的使用
  • 通过此方式,如果远端的代码有bug,就可以直接在本地的IDEA工具中进行调试,非常的方便;

http://chatgpt.dhexx.cn/article/k9v3XHEJ.shtml

相关文章

idea 调试

1、这里以一个web工程为例,点击图中按钮开始运行web工程。 2、设置断点 3、使用postman发送http请求 4、请求发送之后会自动跳到断点处,并且在断点之前会有数据结果显示 5、按F8 在 Debug 模式下,进入下一步,如果当前行断点是一个…

debug idea js,IDEA调试javaScript

谈起JavaScript调试,大家可能想到的就是FireFox下的FireBug,这毫无疑问,FireBug基本已经成为JavaScript开发人员的必备工具。在本文中,将向大家介绍如何在IDEA下远程调试JavaScript,毕竟能在IDE工具中直接设置断点&…

IDEA调试

IDEA调试 1 调试界面各按钮的含义2 调试过程中修改变量的值3 快速定位bug4 实战 IDEA是Java常用的开发工具,这里记录一下IDEA调试相关操作。 1 调试界面各按钮的含义 2 调试过程中修改变量的值 3 快速定位bug 4 实战 可以通过下面的代码实际操作操作,以…

IDEA如何进行debug调试

🌴IDEA如何进行debug调试 🍃第一步,设断点,打开debug🍃第二步,使用Debug调试的功能键 程序调试,相信是所有程序员必经之路,因为程序写出来是不可能没有错误的,当然除了非…

IDEA调试技巧(图文详解,保姆教程)

文章目录 基础篇:一、行断点二、详细断点(源断点)三、方法断点四、异常断点五、字段断点 进阶篇一、条件表达式二、通过调试来打印堆栈信息三、可以通过调试来解析表达式四、避免操作资源drop frames五、常用按键功能介绍六、调试源码七、str…

Intellij IDEA 调试功

本文简单介绍 IDEA 编辑器的调试功能,主要包括断点调试、单点调试、高级调试。可以收藏本文章,使用到的时候方便查找。 1.设置断点 选定要设置断点的代码行,在行号的区域后面单击鼠标左键即可。 2.开启调试会话 点击红色箭头指向的小虫子,开始进入调试。 IDE下方出现 Deb…

在Intellij IDEA中使用Debug

Debug用来追踪代码的运行流程,通常在程序运行过程中出现异常,启用Debug模式可以分析定位异常发生的位置,以及在运行过程中参数的变化。通常我们也可以启用Debug模式来跟踪代码的运行流程去学习三方框架的源码。 所以学习下如何在Intellij IDE…

IDEA的debug调试技巧详解

目录 一、概述 二、debug操作分析 1、打断点 2、运行debug模式 3、重新执行debug 4、让程序执行到下一次断点后暂停 5、让断点处的代码再加一行代码 6、停止debug程序 7、显示所有断点 8、添加断点运行的条件 9、屏蔽所有断点 10、把光标移到当前程序运行位置 11、…

app分享到微信的方案

来源分析 商业分析在微信的使用人数已经高居各通讯APP的榜首的同时,微信成为了我国移动流量最大的平台之一。在次趋势的引导下,很多的商家、体户便抓住了这一机遇,利用微信这个渠道来做产品的推广、以及营销方案宣传。但是好景不长&#xff…

java版微信分享功能(支持分享给好友/分享到朋友圈)

点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐] 先上官方文档:http://mp.weixin.qq.com/wiki/home/index.html 做之前建议先过遍文档,文档都说的清晰明了。 如果已经看过文档,那我们一起整理下JSSDK的流程步骤: 绑定域名 …

Android中实现微信分享的功能

在android开发中微信分享功能还是经常用到的,比如把文字,图片,网页类型,小程序类型的文件等分享给微信好友,朋友圈等。官方文档 那么接下来就来说说如何去实现吧 一.添加依赖 implementation com.tencent.mm.opensdk:…

H5链接分享到微信

在开发中最长遇到的一个需求就是微信分享&#xff0c;那么怎么实现呢&#xff0c;我使用uni-app写的 首先需要一个引导分享的图片 <view v-show"yd" class"boxContent" click"getclose(text)"><image class"yd" src"/s…

微信小程序学习 onShareAppMessage转发分享

最近在做仿抽奖助手小程序&#xff0c;遇上分享的一个问题。抽奖助手分享出来的商品缩略图很清晰且格式更好&#xff0c;而我们分享出来的是页面的默认截图&#xff0c;感觉不好看。其实它这个地方用的是图片&#xff0c;增加一个imageUrl即可。 onShareAppMessage(options) 在…

H5微信分享、自定义微信分享

在一个h5页面添加微信&#xff0c;分享给微信好友、朋友圈、腾讯微博 下面来实现 。 需要&#xff1a; 1、需要一个企业版的微信公众号&#xff08;认证过的&#xff09; 2、一台服务器 企业版的微信公众号原因&#xff1a; 在微信公众平台的接口权限内可以看到&#xff…

使用shareSDK实现微信多图分享到朋友圈Url分享到朋友圈URL分享到好友 问题记录

问题概述 其实第三方分享很早就有了&#xff0c;这个按理说这个应该没什么难度&#xff0c;为啥记录一下呢&#xff0c;因为项目中同时出现了 朋友圈多图分享&#xff08;多张URL集合&#xff09;&#xff0c;朋友圈URL分享&#xff0c;群和个人URL&#xff0c;图片分享。基本…

iOS ShareSDK实现分享——微信分享

最近领导让添加ios 微信分享视频的功能&#xff0c;之前做的只有微信分享本地图片的功能。 查看官网并没有找到答案&#xff0c;后来在其官网论坛中http://bbs.mob.com/thread-20938-1-1.html 这里面发现新版的sdk&#xff08;v3.2.1&#xff09;中才添加的微信分享本地文件&a…

微信分享功能

最近在做手机端页面&#xff0c;需要一个分享功能&#xff0c;其实自身分享是可以的&#xff0c;但是为了分享出的内容丰富&#xff0c;比如缩略图了&#xff0c;描述了等等&#xff0c;如下图所示&#xff1a; 步骤一&#xff1a;绑定域名 先登录微信公众平台进入“公众号…

Android app分享文件到微信

两种实现方案&#xff1a; 1.使用WXFileObject构造分享方法发送到微信&#xff1b; 2.调用系统分享方法&#xff0c;把文件直接发送到微信&#xff1b; 那么下面来分别看看怎么实现&#xff1a; 〇、准备工作 首先&#xff0c;需要在AndroidManifest.xml中配置FileProvider信…

ShareSDK关于微信分享问题

转自&#xff1a;http://www.eoeandroid.com/thread-310281-1-1.html 发现用sharesdk&#xff0c;做其他平台分享很快&#xff1b;如新浪微博、腾讯微博、有道云笔记、开心网、Google等等&#xff0c;几句代码就搞定&#xff1b; 但是微信有点麻烦&#xff0c;下面我把…

uniapp实现录音喊话功能

直接先上代码&#xff1a; const recorderManager uni.getRecorderManager() onShow() {this.test()},methods: {test() {uni.getSetting({success: (res) > {console.log(res.authSetting, res.authSetting[scope.record]);if (res.authSetting[scope.record] false) {…