这是符合CC 4.0 BY-SA版权协议的博主的原创文章。 请附上原文来源的链接和本声明。

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

所有句子

但是,做好事,不要问前途

前言

我认为断点不是IT业者不熟悉的概念,而是任何职业规划(媛)业者都无法避免的非常重要的技能之一。

那到底有多重要呢? 为了说明本文的重要性,我引用几个大人物的话来说明断点调试的重要性

神秘大人物a )调试技巧比编码技巧花在更为重要调试上的时间比编码多,因此比编码学到更多的神秘大人物b )调试技能的重要性非常高3358www 本文主要阐述调试方面的技能、技术,希望对你的职业生涯有所帮助。

说明:这篇文章的说明基于IntelliJ IDEA而不是eclipse,所以让我们从断点对话框开始。

此对话框的默认快捷键是Ctrl Shift F8。 您可以在此管理超过断点(添加或删除)。

要打开鼠标,请执行以下操作: Action-view breakpoints /菜单run-view breakpoints

断点的基本概念断点可能每天都在使用,如果真的要定义它,你觉得暂时还无知吗?

断点:肯定的特殊标记,在调试模式(调试模式)下,可以调用某些操作,如打印线程调用堆栈信息、计算值和打印指定表达式的值。 Tips :断点会立即将设置保存到项目中并手动删除~

必须处于调试模式(调试模式)才能启用断点~

断点参数(断点属性)断点不仅可以独立存在,还可以通过称为断点参数的参数进行自定义。大佬都这么认为了,so我们需要有一个共识:调试能力是一个程序员最最最基础的技能以下详细说明~

开胃菜:例如,最常用的条件断点是断点参数的典型应用

我粗略调查了一下断点的类型,发现80%的合作伙伴断点只需要用所有的这一最基本的方法断点并调试。 其实在现实的场景中,这种方式往往很难快速识别问题所在,所以了解断点的分类、调试技巧有点必要~

出乎意料的是,IDEA为我们提供了丰富的断点类型,使我们能够在不同的调试场景下,使用不同的断点类型实现附加在源代码上面我们的调试效率

从“idea断点”对话框中也可以看到断点已分类。 接下来,介绍断点的分类。 完全不是这个分类。 分类会更加详细。

Line breakpoint :在指定的代码行中设置断点。 行级断点Temporary line breakpoint :与行断点类似。 不同之处在于,这种类型的断点将在激活后立即删除“Field watchpoint (属性断点)”。 在导入或修改属性时,属性断点Method breakpoint (方法断点)处于活动状态。 这是标记为方法行的断点,它有自己的属性参数Exception breakpoint )。 由于抛出程序时3http://www.Sina.com/line breakpoint (行断点),因此与行断点不同,异常断点不需要与源代码进行映射(特定

这是使用不同类型的断点支持的断点参数也不尽相同的断点。 示例操作“视频”:

断点参数

作为第一个介绍的断点类型,这里需要完整说明上面一行中断点操作的断点参数。

Suspend :意外地,如果在复选框中选择了代码行左边鼠标单击,则断点操作大大提高只是线程未被阻止有以下两种阻止策略:

-All :阻止此程序中的异常断点应用程序级别的() (默认) ) ) )。

-Thread :仅阻止当前断点所在的线程(多线程调试,远程调试为最为广泛使用此方法) Condition )这称为有条件断点日志:

选中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,这时候你若想定位问题,通过远程调试直接连接到测试服务(甚至是线上服务)不失为一种最为高效的解决方案,并且它还能有非常好的保护现场的辅助能力~

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

第一步:要让远程服务器运行的代码支持远程调试,也就是启动的时候必须加上特定的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以下)第二步:idea使用remote链接远程端口(注意ip:port要对应上):”Edit Configurations” -> “Remote” 配置好后debug启动~~~

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

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

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

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

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

传统Tomcat怎么开启呢?

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

exec “$PRGDIR”/”$EXECUTABLE” jpda start “$@” 1

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

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

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

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

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

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

总结

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

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

相关阅读

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