debug调试


IDEA断点调试技巧

1. 问题总结

1.怎么开启断点调试?

2.调试界面咋那么多按钮?

    • 1.返回断点位置
    • 2.步过
    • 3.步入
    • 4,5.强制步入,步出
    • 6.回退断点
    • 7.断点跳到光标处
    • 8.表达式计算
    • 9.恢复程序
    • 10.停止程序
    • 11.查看所有断点
    • 12.禁用断点
    • 13.其他

竟然有那么多调试断点?

    • 1.方法断点
    • 2.属性断点
    • 3.异常断点
    • 4.终止断点
    • 5.条件断点
    • 6.流断点
    • 7.多线程断点
    • 8.远程断点

2.怎么开启断点调试?

随着开发的深入,越来越觉得高效的调试方法是多么的重要了,但我们一般上来就是敲一些代码,谁会去静下心来学一些看似没什么用的调试技巧呢?但这恰恰就是新手和老手之间的区别。

断点调试是很简单的,只需要点击idea上方的小虫子,启动调试即可,如下所示。

img这当然不是本文的重点,只是开个头。

3.调试界面咋那么多按钮?

先来介绍一下界面。

img我给这些区域都标了号,下面来重点介绍。

3.1返回断点位置

1号按钮,这个用的不多,如果你从其他地方想要回到断点位置,就按一下即可,如下图所示。

img

3.2步过

2号按钮,说人话就是一行行的往下执行,不会进入方法里面,如下所示。

img

3.3步入

3号按钮,可以进入我们自定义的方法,如果是其他类库的方法不会进入,如下所示。

img

3.4强制步入|步出

4号5号按钮,前者可以进入深层的方法,包括官方的源码,后者就是从对应的方法中出来,演示如下。

img

3.5回退断点

6号按钮是很特殊的,如果你的代码中没有调用其他地方的方法,那么是呈灰色的,无法使用,只有进入更深层的方法,才能够使用,其实就是后悔药,我们很多时候调试时不小心按的快了点,很容易错过想看的位置,只能再次重启吗?不,使用这个drop frame 就可以了,演示如下。

可以看到,这里往下执行了add,但是还没有执行完,按这个按钮,再次回到了调用方法之前,但对于数据库插入等操作,其实是无法回退的,这里的回退只是因为记录了栈信息才能够做到的。

img但是要注意,如果你某个方法调用完毕了,你想再回去那就没有办法了。

3.6断点跳到光标处

7号按钮也用的不多,主要是为了快速跳转到光标指向的那一行,如下所示。

img

3.7表达式计算

8号按钮是计算表达式的,我们模拟从数据库获取集合,用表达式查询对应的元素,如下所示。

img

3.8恢复程序

9号按钮称为 Resume Program,能够跳转到指定的断点处,我们在10行和第100行各加一个断点,需要点几下该按钮跳转到100行呢?答案是一次即可,第一次断点会在第10行停下,点击改按钮直接飞越90行到第100行,如下所示。

img

3.9停止程序

10号按钮就是停止调试,但是注意,即便停止了调试,程序也会继续运行下去,如何想让他就在断点处停止呢?后面我会说到。

3.10查看所有断点

11号按钮打开又别有乾坤,基本功能如下图所示,主要是设置,查看断点信息,大家看着应吧,实用的方法我会在下面讲的。

img

3.11禁用断点

12号按钮就简单了,暂时禁用掉断点,方便程序继续执行,一般配合 Resume Program

3.12其他

13号其实不是按钮,而是一块区域,这里面存放了很多变量的信息,方便我们查看。

14号按钮其实之前被我忽略掉了,这次拿出来讲一下,在watch可以监控变量的变化,有同学说,中间的变量栏也可以看啊,但是单独拉出来,看起来更加的方便,演示如下。

img

4. 竟然有那么多调试断点?

这里省略了普通的行断点调试,毕竟是最简单的,大家都会。

4.1方法断点

方法断点是不是用在普通方法上的,最好的用法是在接口上使用,当我们在调试源码的时候,如果在接口上打了断点,再往下走,可以直接跳转到实现类的实现方法上,而不需要我们一个个的去找。

案例中,有一个接口DemoInterface,它有两个实现类,让我们看下效果吧,演示如下。

img注意:方法断点是一个菱形标志。

img

其实可以直接在接口方法上打断点,直接跳转到对应的实现方法的,这里是为了放慢演示速度。

4.2属性断点

属性断点是打在属性上的,我们无需再getter setter方法上打断点,在属性上打上断点,就会出现一个小眼睛的标志,如下所示。

img

在眼睛上点击右键可以设置。

我们一般是通过getter,setter方法设值的,所以就会在这两个方法上停留。

img

看一下GIF演示吧。

img

4.3异常断点

在线上由于空指针出现了BUG,我们想快速定位到哪里出现了空指针,应该怎么做呢,答案就是,异常断点!演示如下。

注意,异常断点是一个闪电的标志。

img

可以看到,我们在全局打了个空指针断点,只要哪里出现了空指针,就会在那里停止,太方便了!

4.4终止断点

前面我们说过,即便停止程序,也不会让我们后面运行的代码取消执行,那么我一定要取消执行可以吗?当然是可以的,演示如,在方法栈上点击右键,有一个Force Return,然后再点击Resumer Program,就可以直接终止返回了。

img

4.5条件断点

我想要在某个条件满足的时候打上断点,而不想一步步的走下去,有什么办法吗?当然有,在断点处右击,在condition里填入相应的条件即可,演示如下。

img

4.6流断点

我们使用流的时候,很难看到中间做了什么,但其实idea就帮我们解决了,我用断点调试下面代码,给大家演示下。

其实只需要找到这个按钮就行了

img

List<Integer> list = new ArrayList<>(Arrays.asList(1, 3, 3, 4, 4, 4, 5, 6, 78));
       List<Integer> collect = list.stream()
         //先将偶数筛选,再去重,返回集合
               .filter(s -> s % 2 == 0)
               .distinct()
               .collect(Collectors.toList());

img

4.7多线程断点

给大家演示两种情况,多线程下调试,定时任务下调试。

这个演示比较简单,可能有同学不以为意,你可以去尝试下,如果使用默认All来调试多线程程序会发生什么,可能某条线程就跑掉了,没有停留,而这种方式可以捕获到运行的所有线程。

img定时任务这样调试有个好处,即便我们在调试的过程中下一个任务也到时间了,也不会执行,防止多次定时任务执行带来的干扰,我在演示前已经提前一分钟启动了程序,每隔10秒钟打印一次,但是由于暂停了线程的执行,多次点击Resumer Program,发现并没有往下执行哦,而是再等了10秒钟之后执行。

img

4.8远程断点

顾名思义,远程debug就是断点打在你的本地环境, 但是代码是跑在远端的(可以理解为是服务端)。

4.8.1为什么需要远程debug

相信很多人在开发中遇到过这样的问题, 就是明明代码在自己的环境上是好的, 为什么去了测试环境就有问题, 这个时候你可能会质疑测试, 是不是准备的数据有问题?还是不会使用, 导致用错了场景? 还是部署有问题?

在做数据项目的时候, 遇到bug可能会把相应的数据下载到本地开发环境, 然后进行debug, 但如果遇到了如下的问题, 该怎么办呢

  • 数据量特别大, 本地无法下载
  • 数据比较敏感, 安全原因不让下载
  • 本地无法搭建环境, 比如, 需要启动cluster, 需要至少三台物理节点

这个时候远程debug就要上场了, 这样你就能在本地看到远端运行的样子了, 而不用只看输出日志去推断可能哪里出了错误。

4.8.2如何远程debug

4.8.2.1首先看服务器是不是在Debug模式下工作

不是则进行(tomcat/bin/catalina.sh)配置。

-Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n

具体解释:

  • -Xdebug : 启用调试特性。
  • -Xrunjdwp:在目标 VM 中加载 JDWP 实现。它通过传输和 JDWP 协议与独立的调试器应用程序通信。下面介绍一些特定的子选项。
  • transport: 这里通常使用套接字传输。但是在 Windows 平台上也可以使用共享内存传输。
  • address 这是连接的传输地址。如果服务器为 n ,将尝试连接到该地址上的调试器应用程序。否则,将在这个端口监听连接。
  • server 如果值为 y ,目标应用程序监听将要连接的调试器应用程序。否则,它将连接到特定地址上的调试器应用程序。
  • suspend 如果值为 y ,目标 VM 将暂停,直到调试器应用程序进行连接。
4.8.2.2本地IDEA进行远程Debug

其实非常简单, 用Intellij IDEA打开你的代码, 点击右上角的“Edit Configurations”

image-20220901104745631

然后点击左上角的”+“, 添加一个“Remote”, 这个选项就是用来做远程Debug用的, 并且添加远程DEBUG配置项,Host和Port,端口默认给的是5005。配置后,点击ApplyOK按钮(然后只要把IP和刚才配置的端口号加上就行。

image-20220901104935150

4.8.3远程debug测试

我们直接在TestController类里的test方法上打断点:

image-20220901105824672

然后选择远程debug启动项,点击调试按钮启动。

打开postman测试:

image-20220901105616699
发现成功进入断点

image-20220901105729273


文章作者: Beaumon
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Beaumon !
评论
  目录