专栏首页BAT的乌托邦熟练使用IDEA的断点调试(Breakpoint),大大提升你调试代码的效率(行断点、属性断点、异常断点、条件断点、远程debug...)【享学Java】

熟练使用IDEA的断点调试(Breakpoint),大大提升你调试代码的效率(行断点、属性断点、异常断点、条件断点、远程debug...)【享学Java】

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/f641385712/article/details/93145454

每篇一句

但行好事,莫问前程

前言

断点调试对IT从业者不是一个陌生的概念,我认为它是每个程序猿(媛)从业者这个职业盛业都避不开的且非常重要的技能之一。 那它到底有多重要呢?为了体现本文的重要性,我引用几个大佬的话来表述断点调试的重要性:

  1. 神秘大佬A:调试技巧比编码技巧更为重要,因为花费在调试上的时间往往比编码还多,学到的东西比编码中学到的更丰富
  2. 神秘大佬B:调试技能重要性甚⾄超过学习⼀门语⾔
  3. 神秘大佬C:不会调试的程序员,肯定编制不出任何好的软件

大佬都这么认为了,so我们需要有一个共识:调试能力是一个程序员最最最基础的技能。本文主要发力讲述调试的相关技能、技巧,希望对你的职业生涯能有所帮助。

说明:本文讲解是基于IntelliJ IDEA而非eclipse,因此我们从它的断点对话框开始:

弹出此对话框默认快捷键是:Ctrl + Shift +F8,在这里你可以管理所有的断点(增删改)。

鼠标方式可以这样开启:Action-view breakpoints / 菜单run-view breakpoints

断点的基本概念

断点你可能天天都在使用,但是若真要你对它下定义,估计一时间还有点懵逼呢有木有?

断点:是一种附加在源代码上面的特殊标记,在调试模式(debug模式)下可以触发特定的动作,比如打印线程调用栈信息、计算值、打印指定表达式的值等等。Tips:断点一但设置就会一直保存在工程中直到手动删除~

断点若想生效,必须是调试模式(debug模式)下才行~

断点参数(断点属性)

断点并不是仅仅是孤立的存在的,它也可以通过参数进行定制化,这些叫断点参数不同类型的断点支持的断点参数也不尽相同,在下面具体介绍时会详细说明~

开胃小菜:比如最常用的条件断点,它就是断点参数的一个典型应用

断点的种类

据我粗略调查,80%的小伙伴打断点只会采用代码行左边鼠标单击这种最基础的方式打断点然后调试。其实在现实场景中,有非常非常多的情况下,这种方式将很难快速定位到问题所在,因此了解断点分类、调试技巧就显得有点必须了~

殊不知,IDEA给我们提供了丰富的断点类型,让我们能够在不同的调试场景下,使用不同的断点类型来大大提高我们的调试效率,毕竟效率就是时间,而时间就是生命

从idea断点对话框里也能够看出断点是分类的。然后下面我对断点的分类讲解不是完全按此分类,我的分类会更加详细如下:

  1. Line breakpoint(行断点):在指定代码行设置断点,属于行级别的断点
  2. Temporary line breakpoint(临时行断点):与行断点类似,不同之处在于该类型的断点在被激活之后会被立即删除
  3. Field watchpoint(属性断点)读取或者修改属性时会激活属性断点
  4. Method breakpoint(方法断点):它是标记在方法那一行的断点,有自己特有的属性参数
  5. Exception breakpoint(异常断点):当程序抛出指定异常时会激活异常断点。与行断点不同,异常断点不需要与源代码映射(不需要打在具体某一行代码上),因为异常断点应用程序级别的


Line breakpoint(行断点)

这是使用得最为广泛的一种断点。示例操作“视频“:

断点参数

作为第一个介绍的断点类型,这里有必要全面的解释一下上面行断点操作的断点参数:

  • Suspend:有没有让你诧异到,它竟然是个复选框并且还可以不被选中。若它不被选中的话断点的相关动作依然激活执行,只是线程不会被组塞了而已。它的两种阻塞策略如下: - All:阻塞该程序内所有线程(默认) - Thread:只阻塞当前断点所在线程(在多线程调试、远程调试中强烈建议使用这种方式)
  • Condition:这就是所谓的条件断点,只有书写的表达式返回true时候断点才会被激活
  • Log: - 勾选"Breakpoint hit message":断点激活时输出提示日志 - 勾选"Stack trace":断点激活时输出程序调用栈信息 - 勾选"Evaluate and log":并在下面的输入框中输入"args",断点激活时会计算并输出变量 args 的值 - 他哥三是可以同时被勾选的(因为都是复选框~)

这里其实已经把绝大多数共用的断点参数都讲述了,这样下面就会稍微简单点了~~

Temporary line breakpoint(临时行断点)

创建方法不说了,同上。和上面的唯一区别是:把Remove once hit这个复选框给勾选上(此类型断点其实使用较少)。

Field watchpoint(属性断点)

创建的方式和上无差异。

断点参数

由于绝大多数参数第一个已经讲述了,so这里只剩一个它独有的参数:

  • Watch:选中"Filed Access" 读取的时候都会断住。选中"Filed madification"表示修改的时候都会断住

Method breakpoint(方法断点)

打断点方式同上,只是它是必须把断点打在方法那一行上

它也有一个自己独有的参数:

参数
  • Watch: - “Method entry”:进入方法时激活断点 - “Method exit”:出去方法时激活断点 - “Emulated”:目前发现没啥卵用(求小伙伴不要喷我~)

Exception breakpoint(异常断点)

异常断点属于非常特殊的一种断点类型,它不对应任何一行代码,因为它属于程序级别的断点。 它不能像上面在代码处直接创建,只能通过上面的断点对话框来创建。

此处注意:异常断点中很多选项就是不能使用的(灰色)如下图示:

断点参数

但是同理,它也提供一个特有的断点参数:

  • Notification: - “Catch excetion”:程序在捕获(Try Catch)这个异常时激活断点 - “Uncatch excetion”:不catch捕获异常时激活断点

小细节:对于不同类型的断点,打桩后我们看到的图标也是有差异的,如图:



关于IDEA的远程调试(远程Debug)

远程调试是调试分布式系统的一个利器。因为现在都以微服务部署,你不可能在本地同时启动N个服务来做本地调试。 更重要的是如果测试时候测出发现你的bug,这时候你若想定位问题,通过远程调试直接连接到测试服务(甚至是线上服务)不失为一种最为高效的解决方案,并且它还能有非常好的保护现场的辅助能力~

启动远程调试主要分两步:

  1. 第一步:要让远程服务器运行的代码支持远程调试,也就是启动的时候必须加上特定的JVM参数: 1. java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=${debug_port} demo.jar (适用于JDK8以上) 2. java -Xdebug -Xrunjdwp:transport=dt_socket,suspend=n,server=y,address=${debug_port} demo.jar(适用于JDK8以下)
  2. 第二步:idea使用remote链接远程端口(注意ip:port要对应上):”Edit Configurations” -> “Remote” 配置好后debug启动~~~

当你看到控制台这样的字样,就证明你链接成功了,进而你可以像调试本地代码一样随意的打各种类型的断点进行调试了~

需要注意的是:远程调试时请确保你本地的代码和远程的一模一样。


Java平台调试体系架构(JPDA)和JDWP(Java Debug Wire Protocol):参考权威文档 JPDA 体系概览 以及 JDWP 远程命令执行漏洞

JDWP协议是个标准协议,我们的Tomcat是支持的,其实tomcat它的catalina.sh文件里有告诉你怎么开启这个端口:

对上面变量的解析代码如下(注意有些默认值):

传统Tomcat怎么开启呢?

找到入口文件startup.sh,最后一句改为的start前面加上 jpda如下:

exec "$PRGDIR"/"$EXECUTABLE" jpda start "$@"

或者在catalina.sh中进行配置:

JPDA_OPTS='-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005’

这样根据上面的脚本可知,判断第一个参数等于jpda,所以调试端口开放了。

嵌入式Tomcat怎么开启呢?(重要)

这里主要指的SpringBoot环境下如何开启呢?答案见上~

如果想深入了解Java调试,强烈给你推荐去这里看看:深入Java调试体系


总结

本文并没有介绍所有的断点参数,如对话框的右半部分的Catch class filter等等各种filter的参数,因为我觉得没太大的用~~~有兴趣的自行研究哈

另外本文讲述使用的IDE是IntelliJ IDEA,使用Eclipse的用户可以仿照着执行~

相关阅读

详细的 IDEA 中使用 Debug 补充教程

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • IDEA 这个快捷键有 17 个实用技巧,你竟然还不知道?

    IDEA里有一个万能快捷键(alt enter),功能非常强大,同一个快捷键,可以根据不同的语境提示你不同的操作, 很多人可能还不了解这些功能,在处理代码的时候...

    zhisheng
  • 解决PKIX问题:unable to find valid certification path to requested target

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

    奋飛
  • Jad反编译及eclipse反编译插件JadClipse

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

    奋飛
  • java启动和停止sh

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

    奋飛
  • 解决PKIX问题:unable to find valid certification path to requested target【X509TrustManager】

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

    奋飛
  • Window下安装Maven及Eclipse中安装m2eclipse插件

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

    奋飛
  • Memcache集群环境下缓存解决方案

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

    奋飛
  • JavaScript闭包及实现循环绑定事件

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

    奋飛
  • iBatis搭建JAVA项目

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

    奋飛
  • JavaScript对象

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

    奋飛

扫码关注云+社区

领取腾讯云代金券