IDEA中如果优雅Debug

目录

一、 Debug 概述

二、Deubg中常用调试按钮介绍

横排功能点介绍

竖排功能点介绍

跳转到当前执行代码的行

步过

步入

强制步入

步出

回退断点处

定位到光标处

计算表达式

三、查看参数

参数所在行后面显示

光标悬浮查看

在 Variables 里查看

在 Watches 里查看

四、条件断点

五、Debug 服务设置按钮

执行到下一个断点处直到结束

断点静音

查看/清除断点

返回到第一个断点的地方

六、多线程调试

七、异常断点调式

八、字段调式

九、方法调试

十、Stream流的断点调式

十一、远程调式


一、 Debug 概述

Debug 是供程序员使用的程序调试工具,它可以用于查看程序的执行流程,也可以用于追踪程序执行过程来调试程序。

最近一直想写一篇关于IDEA中如何Debug,刚好这个周末有空,就静下心来写下这篇文章,对Debug总结与学习。

二、Deubg中常用调试按钮介绍


我们先看下 IDEA 中 Debug 模式下的界面:

横排功能点介绍

我们先说横排的 8 个按钮,我会按照横 1、横 2 这样的命名方式来介绍。

  1. 横 1:从其他界面回到当前断点界面光标处。
  2. 横 2:从断点处开始,逐行执行代码,如果遇到方法,直接跳过。
  3. 横 3:从断点处开始,逐行执行代码,如果遇到方法,会进入方法,但是只能进入自定义方法,不会进入官方类库的方法。
  4. 横 4:从断点处开始,逐行执行代码,如果遇到方法,会进入方法,适用于所有方法。
  5. 横 5:从当前断点处回退,回到方法的调用处。
  6. 横 6:回退断点,回到上一个断点处,与横 5 的区别在于,它会回到上一个方法的断点中,而横 5 只会回到上一个方法的调用处,并不会进入方法。
  7. 横 7:回到断点光标处,与横 1 的区别在于,它会继续往后执行一行代码。
  8. 横 8:计算表达式,在 debug 模式中,可以直接输入当前类中的任意一个方法,直接进行

竖排功能点介绍

  1. 竖 1:重新运行程序,进入 debug 模式。
  2. 竖 2:执行程序,但不是逐行执行,而是跳转到下一个断点处。
  3. 竖 3:暂停断点,这个基本用不到。
  4. 竖 4:终止程序的运行。
  5. 竖 5:显示所有断点,如下图所示。
  6. 竖 6:让所有断点失效,debug 不再进入断点,要恢复断点,再次点击此按钮即可。 

跳转到当前执行代码的行

我们先在一个页面设置一个断点,然后再切换到其他页面,点击这个按钮,发现又跳转到了执行代码所在的行

步过

 步过就是一步一步往下走,跳过所有方法:

 上面的例子中即便是遇到了 system 打印方法和 test1 方法,也会跨过去继续往下执行。

步入

 在执行的过程中如果遇到了自定义的方法,可以进入方法内部,不会进入 JDK 类库中的方法

上面的例子中,遇到了 system 方法会自动跨过去,但是遇到了自定义的方法,则会进入到方法中中执行,等执行完则会返回到方法的调用处。

强制步入

 不管遇到 JDK 的类库方法还是自定义方法,都会进入到方法中执行。

上面的例子中不管遇到了JDK 类库中的 system 方法还是自定义的 test1方法,都会进入到方法中执行。

步出

 步出就是从进入的方法内部退回到方法调用处。

上面的例子中我们进入到了 test1 方法的内部,当点击步出按钮后,又回到了调用 test1 方法的地方。

回退断点处

 回退断点处意思就是可以回退到指定方法的调用处。

 上面的例子中我们依次执行了 test1、test2、method2 方法,但是我们可以选择直接回退到 test1 方法的调用处。

步出和回退断点的区别:

  • 都是回到方法的调用处
  • 步出只能回到当前方法的调用处
  • 回退断点可以回到指定方法的调用处,前提是该方法已经被执行过。

定位到光标

一步往下执行也比较费时间。这时候我们可以先把光标放到一个指定位置,然后点击定位光标处按钮,这时候代码就会立即执行到光标处了。

上面的例子中我们把鼠标光标移动到了下面某一行,然后点击定位光标处按钮,代码立刻执行到了这一行。

计算表达式

 计算表达式可以帮助我们计算一些表达式的返回值。

 从上面的例子中可以看出,我们可以在调用某些方法之前使用一些自定义参数去计算该方法的返回值。

三、查看参数

参数所在行后面显示

光标悬浮查看

光标悬浮到参数上,显示当前变量的信息,我经常使用这种方法,特别方便。

在 Variables 里查看

这里显示当前方法里的所有变量。

在 Watches 里查看

在 Watches 里,点击 New Watch,输入需要查看的变量:

四、条件断点

有时候我们代码中会包含很多 for 语句,但是使用断点调试的时候会执行很多次。这时候我们可以选择断点,鼠标右键设置一个条件,只有满足该条件时,断点才会执行到此处。

 上面的例子中我们给断点设置一个条件:i==50,所以以 Debug 模式运行该程序的时候我们发现此时 i 就是50。

五、Debug 服务设置按钮

执行到下一个断点处直到结束

该按钮的作用:如果下面有断点,就跳转到下一个断点处。如果没有,程序就执行结束。

断点静音

 有时候我们在执行到某一步的时候已经知道了结果,但是后面还有一堆断点。我想让这些断点失效,但是第二次跟踪我还想用这些断点,这时候就可以使用断点静音

查看/清除断点

 我们在执行完代码后要清除所有断点,但是一个个去清除太浪费时间,这时候就可以使用这个按钮查看所有设置的断点,或者清除所有断点。

返回到第一个断点的地方

 代码执行到某一行想返回到第一个断点处:

六、多线程调试

因为 CPU 执行线程的顺序是随机的,但是我们使用断点调试可以自定义执行下一个线程。

首先将两个线程的断点都设置成线程模式:

七、异常断点调式

代码报错抛出异常了,知道是啥类型异常,希望在抛异常之前,看看数据是什么样的,为啥异常了,就可以使用这种方法,比如最常见的空指针异常

我们打个断点,点击左下角两个叠加的红色圆圈,可以查看所有断点,然后点击加号,出现5中类型断点,选择第三个Java Exception Breakpoints,选择空指针异常

打好断点后,再次debug,再发生异常前,会停留在即将发生异常的那行代码上

八、字段调式

可用于定位某个字段在何时被赋值,何时被赋成这个值,在源码阅读时,经常搞不懂这个变量的值从哪里来的,这个断点可以很好解决这个问题

给测试类加上name,age属性

private String name;
private Integer age;

//测试代码
Test04 test04 = new Test04();
test04.setName("888");
test04.setName("444");
test04.setName("555");
test04.setName("哈哈哈");
test04.setName("999");
test04.getName();
还是一样的操作,此时断点变成了红色眼睛。

看看勾选Field access效果。跳到getName方法处

九、方法调试

当一个接口的实现类特别多,比如spring里面比比皆是,变量类型为接口,实际调用时,可以通过强制进入方法内可以看进入哪个子类,也可采用接口方法打断点方式来选择走到哪个子类

上代码,一个接口,两个子类。测试方法中使用接口类型的变量调用print方法。在接口的print()方法打断点,是红色方块形的断点,然后运行

十、Stream流的断点调式

Java8加入了Stream流特性,把集合的操作变简单了,同时可读性也降低了。一阵链式操作,行云流水,却把人搞得丈二和尚摸不着头脑,啥玩意

idea也提供了一个很方便的功能,那就是Trace Current Stream Chain

十一、远程调式

IDEA远程调试配置


1,打开idea,顶部菜单栏选择Run-> Edit Configurations,进入下图的运行/调试配置界面。

2,点击左上角'+'号,选择Remote。分别填写右侧三个红框中的参数:Name,Host(想要指定的远程调试端口)。

3,点击界面右下角应用按钮即可。

 服务端开始debug模式
 

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar xxx.jar

 idea启动远程调用

程序上打上断点,点击运行。调用服务器端运行的系统程序,系统自动进入断点。

启动远程调试参数解释 

  • -Xdebug:通知JVM工作在调试模式下
  • -Xrunjdwp:通知JVM使用(java debug wire protocol)来运行调试环境。参数同时有一系列的调试选项
  • transport:指定了调试数据的传送方式,dt_socket是指用SOCKET模式,另外dt_shmem指用共享内存方式,其中dt_shmem只适用于窗口平台.server  参数是指是否支持在服务器模式的虚拟机中。
  • server参数是指是否支持在server模式的VM中。
  • onthrow:指明当产生该类型的异常时,JVM就会中断下来,进行调式该参数任选。
  • launch指明,当JVM被中断下来时,执行的可执行程序。该参数可选。
  • suspend指明,是否在调试客户端建立起来后,再执行JVM。
  • onuncaught(= y或n)指明出现未捕获的异常后,是否中断JVM的执行。
     


参考文章

1. https://blog.csdn.net/qq_52252193/article/details/124669570

2. idea比较好用的断点调试方法 - 方大大大 - 博客园

3.使用idea进行远程调试_win1699的博客-CSDN博客_idea远程调试

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值