实用的 IDEA Debug 调试技巧(超详细案例)

您所在的位置:网站首页 vba代码调试过程中能够使用什么 实用的 IDEA Debug 调试技巧(超详细案例)

实用的 IDEA Debug 调试技巧(超详细案例)

#实用的 IDEA Debug 调试技巧(超详细案例)| 来源: 网络整理| 查看: 265

文章目录 前言正文Debug 的常见使用场景基础操作行断点(Line Breakpoints)方法断点(Method Breakpoint)字段断点(Field Watchpoints)异常断点(Exception Breakpoints)主动抛异常(Throw Exception)降帧(Drop Frame)断点条件(Condition)强制返回(Force Return)Stream 调试(Trace Current Stream Chain)执行表达式(Evaluate Expression)远程调试(Remote JVM Debug)远程调试使用教程多线程调试(Suspend)Thread模式执行All 模式执行

前言

Debug 是程序员的开发神器,使用好了可以帮助我们非常高效的工作、学习、排查问题等。毫不客气的说,是决定我们进阶到更高层级的一个重要技能。

今天跟大家分享一下 IDEA 中 Debug 调试的各种技巧。

正文 Debug 的常见使用场景

需求代码测试:通过debug你才能知道你的代码究竟是怎么运行的,更容易发现问题

问题排查:只要能进入到问题流程的debug,就没有排查不了的问题

源码学习:源码通常很庞大,通过Debug 我们能更清晰的知道执行到哪个地方,执行时的各个变量数据

基础操作

Step over(F8):程序往下执行一行

Step into(F7):进入方法内,可以进入自定义方法或三方库方法,JDK方法无法进入

Force step into(Alt+Shift+F7):强制进入方法内,一般 Step into 进不去时可以使用

Step out(Shift+F8):退出方法,跟(force)step into 配合使用

Resume Program(F9):恢复运行程序,运行到下一个断点的地方 5个操作从上往下分别对应下图的1-5,这也是 Debug 最常用的几个基础操作。 请添加图片描述

行断点(Line Breakpoints)

图标:红色圆形

功能:最常用的断点,在断点所在行进行暂停。 请添加图片描述 理论上只要有行断点和上面的基本操作,就可以完成大部分的 Debug 调试了,但是很多场景下只使用这些功能,调试是很低效了,接下来我们将依次介绍各种好用的调试技巧。

方法断点(Method Breakpoint)

图标:红色菱形

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

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

缺点:可能会大大降低debug速度 请添加图片描述

字段断点(Field Watchpoints)

图标:红色眼睛

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

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

而如果我们想在字段被访问时也暂停,则可以右键字段断点,将【Field access】勾选上即可。 请添加图片描述

异常断点(Exception Breakpoints)

图标:红色闪电

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

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

主动抛异常(Throw Exception)

图标:无,Frames 堆栈中右键显示

功能:主动抛出指定异常

在上面的例子中,我们通过代码构造了一个异常,但是这种方式其实是不太方便的,特别是如果我们想在远程环境抛出一个异常,需要修改代码重新部署,测试完后还要修改回来再次部署。而 Throw Exception 则可以直接抛出一个异常,避免了这些繁琐的流程。 请添加图片描述 请添加图片描述

降帧(Drop Frame)

请添加图片描述 功能:当我们 Debug 从 A 方法进入 B 方法时,通过降帧(退帧)可以返回到调用 B 方法前,这样我们就可以再一次调用 B 方法。

通常用于当我们快执行完 B 方法后,发现某个重要流程被我们跳过了,想再看一下,则此时可以先回退到 A 方法,然后再次进入 B 方法。

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

断点条件(Condition)

请添加图片描述 功能:当程序执行到断点位置时,需要 Condition 中的表达式返回 true,才会暂停,否则会直接跳过。

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

强制返回(Force Return)

请添加图片描述 功能:强制结束当前程序运行流程,直接返回。

当我们调试时,发现继续往下执行就要将错误的数据写入数据库时,我们可以通过 Force Return 来强行结束当前流程。 请添加图片描述 而如果我们是通过 Stop 按钮来结束,此时结束的是 Debug 流程,而程序流程还是会往下执行,从而将错误数据写入数据库。 请添加图片描述

Stream 调试(Trace Current Stream Chain)

请添加图片描述 功能:当我们暂停在 Stream 的处理代码行时,可以将 Stream 的整个处理流程以图形化界面的形式展示。 请添加图片描述 合理的使用 Stream 会让我们的代码更加简洁,但是现在存在大量滥用 Stream 的情况,Stream 本身就比较抽象,大量滥用会使得 Stream 的代码难以理解和调试。

当我们发现问题出在 Stream 的处理流程中时,我们可以通过该功能来看到每个步骤处理前和处理后的数据,方便我们定位排查是哪一步出了问题。

执行表达式(Evaluate Expression)

请添加图片描述 功能:用于执行一段我们实时写的代码,例如查看数据、修改数据。 请添加图片描述 当我们在测试时,发现某段代码逻辑很难有符合条件的数据时,可以通过该功能直接修改数据,来加快我们的测试。

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

远程调试(Remote JVM Debug)

请添加图片描述 功能:调试部署在远程服务器上的代码。

远程调试最常见的使用场景是排查线上问题,下面举个例子。

有一个用户(userId=8888)请求某个接口会出现异常,但是其他用户是正常的,包括我们的各种测试账号。

此时我们可以使用测试账号(userId=1222),在预发布环境向该接口发起请求,并且我们会通过远程 Debug 在接口入口处拦截住该请求,然后我们通过执行表达式功能,将userId从1222修改为8888,则接下来我们就可以模拟出现问题的用户来调试整个接口了,从而帮助我们快速定位到问题。

注意:使用远程Debug的环境必须不能对外网访问,否则可能存在安全隐患。

远程调试使用教程

不同版本的远程 Debug 所需的配置参数不同,通过Idea 可以看到不同版本对应的参数。 请添加图片描述 各个版本所需配置参数:

// JDK1.3 or earlier -Xnoagent -Djava.compiler=NONE -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 // JDK1.4 -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 // JDK5-8: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 // JDK9 or later -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005

配置方式主要用以下两种:

1)使用启动命令

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar java-study-demo-0.0.1-SNAPSHOT.jar

2)在启动脚本中增加上述配置

下面在本地模拟一个流程:

1)模拟启动一个服务,使用了远程 Debug 的参数启动 请添加图片描述 2)通过浏览器发送请求,可以看到此时由于被我们 Debug 住,所以左上角会有个图标在转圈圈等待 请添加图片描述 3)可以看到请求确实被我们拦截住了,接着我们就可以像本地Debug一样来进行调试了 请添加图片描述

多线程调试(Suspend)

请添加图片描述 Suspend 有两种模式:All 和 Thread。

Thread:暂停进入断点的线程,不影响其他线程执行。所有进入断电的线程依次Debug。

All:暂停全部线程。只能 Debug 第一个暂停线程。

这边两种模式的后半句如果难以理解,可以看下我视频里面的案例来帮助理解。

Thread模式执行

通过输出内容,可以看到线程1被阻塞,线程2和主线程都已经执行结束 请添加图片描述

All 模式执行

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3