IDEA 断点(高级) idea中断点调试
yuyutoo 2024-10-12 01:52 1 浏览 0 评论
1. 快捷方式
- 新增或删除断点(当前有效行):Ctrl+F8
- 编辑断点属性:Ctrl+Shrit+F8
2. 断点类型与设置
行断点
- 在到达设置断点的代码行时暂停程序。这种类型的断点可以设置在任何可执行的代码行上。
字段断点
- 当指定的字段被读取或写入时暂停程序。这允许你对与特定实例变量的交互作出反应。
- 例如,如果在一个复杂的过程结束时,你的某个字段出现了明显的错误值,设置一个字段观察点可能有助于确定故障的来源。
- 鼠标右键点击该断点图标 ,弹出该断点配置,会有Field access和Field modification选项,
- 此选项是字段类型断点特有的,分别对应访问该字段或修改该字段触发断点,两项同时选中,则访问与修改该字段都会触发断点。
方法断点
- 在进入或退出指定的方法或其实现之时暂停程序,允许你检查该方法的进入/退出条件。
- 当断点加在class类名这一行,且该类中没有编写构造函数(只有默认无参构造函数),当调用默认无参构造函数时会触发此断点,程序挂起,故该断点虽然图标是行断点类型图标,但实际上属于方法类型断点。
- 鼠标右键点击该断点图标 ,弹出该断点配置,会有Emulated、Method entry、Method exit选项,此选项是方法类型断点特有的。
Emulated勾选中,会将方法断点优化成方法中第一条和最后一条语句的行断点,这样会优化调试的性能,因此在IDE中会默认选中。
Method entry勾选中,将方法的第一条语句进行行断点
Method exit勾选中,将方法的最后一条语句进行行断点
- 通过匹配符批量添加方法断点,在断点列表页
- 匹配符示例:
Class pattern | Method name | 说明 |
* | run | 匹配所有类的run()方法 |
Student | * | 匹配Student类的所有方法 |
Student | run | 匹配Student类的run()方法 |
异常断点
- 异常断点分为两种,一种是Any Exception,任意Throwable异常被捕获或未被捕获就会触发断点,另一种是指定类型的异常及其该异常子类被捕获或未被捕获会触发断点
- 鼠标右键点击该断点图标 ,弹出该断点配置,会有Caught exception和Uncaught exception选项,此选项是字段类型断点特有的。
Caught exception选项选中时,当指定的异常被捕获时,触发断点程序挂起
Uncaught exception选中时,当指定的异常未被捕获时,触发断点程序挂起
3. 断点控制
删除断点
- 所有类型断点:断点设置中移除对应的即可。
- 快捷移除:行位置鼠标左键单击即可移除(异常断点除外)
禁用断点
- 如果某些时候不需要在断点处停留一段时间,可以将断点禁用。这样就可以在不离开调试器会话的情况下恢复正常的程序操作。之后,可以解除中断点的禁用,继续调试。
可以控制所有断点的禁用
可以控制单个断点的禁用
移动/复制断点(不常用)
- 断点移动:鼠标左键拖动
- 断点复制:按住ctrl,鼠标左键拖动
4. 断点属性配置
- 鼠标操作:右键断点:More(Ctrl+Shift+F8)
- 快捷键:Ctrl+Shift+F8
- 快捷键:光标所在行 Alt+Enter
断点有许多属性配置,如下图所示
Enabled
- 表示是否启用该断点,选中表示启用,取消选中表示不启用。
Supend
- 当断点的 Suppend 属性被勾选,触发该断点时,会触发程序挂起,当该属性未选中时,程序触发该断点时,程序不会挂起,常用于输出一些表达式结果日志。
- 当断点的 All 属性被勾选,触发该断点时,会挂起所有线程当断点的 Thead 属性被勾选,触发该断点时,只会挂起触发该断点的那个线程,不影响其他线程
- 当需要在不暂停程序的情况下记录一些表达式时(例如,需要知道一个方法被调用了多少次时),或者需要创建一个主断点,在击中后启用附属断点时,非暂停性断点是非常有用的。
- 实际生产实践中,可用于调试多线程并发的问题
Condition
- 可以输入一段能获得true或false的表达式,程序运行到断点处,且表达式条件为true才会触发断点
Log
- 下面三个属性选项经常配合 Suppend 属性一起使用,用于在不挂起的情况下,输出一些想要的日志信息
Breakpint hit message :控制台输出触发端点的日志信息,类似如: Breakpoint reached at com.project.info.test.TestOne.main(TestOne.java:18)
Stack trace :输出触发断点时的堆栈信息(非常实用,特别是代码嵌套比较深)
Evaluate and log :计算表达式结果并输出表达式结果到控制台,表达式的计算基于断点所在行的上下文,表达式的语句可以是字符串字面量,如 "我是字符串" ,也可以是方法调用,如users.size() ,也可以是多行语句块,表达式的结果取自return语句,如果没有return语句,会取表达式中的最后一行语句。
Remove once hit
- 是否在断点触发后移除该断点,后续不再触发
Disable until hitting the following breakpoint
- 指定在另一个断点触发后,该断点才启用,若该断点启用后,并且被触发
- 场景:当只需要在某些条件下或者某些操作后暂停程序时,这个选项很有用。在这种情况下,触发断点通常不需要停止程序的执行,而是做成非暂停状态。
Filters
- 前边说的大都数属性,都只针对方法程序运行上下文。
- 此属性更多关注通过过滤掉类、实例和调用者方法来微调断点操作,只在需要时暂停程序。
- Catch class filters :此选项只对异常类型的断点可用,可以让程序只在指定类和子类中抛出的异常才会触发断点或者不在指定的类和子类中触发断点(即排除一些类,排除通常以 - 开始,例如 -pacakge.ClassName )
- Instance filters :只有指定实例id号可以触发断点,多个实例id号以逗号隔开,实例id号可以在Variables和Memory面板中查看
- Class filters :可以让程序只在指定类和子类中才会触发断点或者不在指定的类和子类中触发断点(即排除一些类)。
- Caller filters :根据调用者来进行过滤,需指定方法的全限定名(包含方法签名),例如mypackage.MyObject.addString(Ljava/lang/String)
配置 | 说明 | 适用 |
-package1.Class1.method1([Ljava/lang/String;)Ljava/util/List; | 该示例中排除了来自package1.Class1类中method1方法并且方法签名是: List method1(String[] input) 的调用(即不触发断点) | caller filter |
package1.Class1 *s2 -package3.Class3 | 该示例中,断点仅在package1.Class1以及全限定名以 s2结尾的类中可以被触发,并且不在package3.Class3中触发( - 开头表示排除) | Class filters 和 catch class filter |
-java.* -sun.* | 该示例排除了 javaand sun包下的所有类(``- 开头表示排除) | Class filters 和 catch class filter |
Pass count
- 勾选中并输入一个正整数N,N>=1,那么程序会每N次命中断点才会触发挂起,如果同时设置了condition 与 pass count 属性,ide会优先判断 condition 表达式,再判断 pass count 是否满足,下例中, pass count 中传入的是5,每5次命中断点才会触发断点,挂起程序
5. 断点状态
状态 | 描述 |
Verified | 启动调试器会话后,调试器会检查在技术上是否可以在断点处暂停程序。如果是,调试器将该断点标记为已验证。 |
Warning | 如果在技术上可以在断点处暂停程序,但是有相关的问题,调试器会给你一个警告。例如,这可能发生在无法在某个方法的实现处暂停程序的情况下。 |
Invalid | 如果在技术上不可能在断点处暂停程序,调试器会将其标记为无效。最常见的原因是该行没有可执行的代码。 |
Inactive/dependent | 当一个断点被配置为禁用,直到另一个断点被击中,而这还没有发生时,该断点被标记为非活动/依赖性。 |
Muted | 所有的断点都是暂时不活动的,因为它们已经被静止了。 |
Disabled | 该断点暂时不活动,因为它已被禁用。 |
Non-suspending | 为该断点设置了暂停策略,因此,当击中该断点时不会暂停执行。 |
6. 远程调试
- 打开Idea的 Run/Debug Configurations 新增一个Remote。 JVM参数添加 -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
- 远程项目启动添加参数:java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar xxx.jar
- idea启动remote,并打断点调试
7. 生产环境建议
1. 使用断点进行 "printf "调试
使用非暂停的日志断点,而不是在代码中插入打印语句。这为处理调试日志信息提供了一种更灵活和集中的方式。
场景:所有需要打印的地方,生产上禁止 System.out.print();
2. 调试无响应的应用程序
如果你的应用程序挂起,暂停会话,让调试器获得关于其当前状态的信息。然后你可以检查程序的状态并找出问题的原因。
场景:项目启动卡死等处理
3. 测试你的程序是否有并发性问题
发现多线程程序在并发方面是否健壮的一个好方法是使用断点,在碰到时只暂停一个线程。停止一个线程可能会揭示出应用程序设计中的问题,否则这些问题就不会显现出来。
相关推荐
- jQuery VS AngularJS 你更钟爱哪个?
-
在这一次的Web开发教程中,我会尽力解答有关于jQuery和AngularJS的两个非常常见的问题,即jQuery和AngularJS之间的区别是什么?也就是说jQueryVSAngularJS?...
- Jquery实时校验,指定长度的「负小数」,小数位未满末尾补0
-
在可以输入【负小数】的输入框获取到焦点时,移除千位分隔符,在输入数据时,实时校验输入内容是否正确,失去焦点后,添加千位分隔符格式化数字。同时小数位未满时末尾补0。HTML代码...
- 如何在pbootCMS前台调用自定义表单?pbootCMS自定义调用代码示例
-
要在pbootCMS前台调用自定义表单,您需要在后台创建表单并为其添加字段,然后在前台模板文件中添加相关代码,如提交按钮和表单验证代码。您还可以自定义表单数据的存储位置、添加文件上传字段、日期选择器、...
- 编程技巧:Jquery实时验证,指定长度的「负小数」
-
为了保障【负小数】的正确性,做成了通过Jquery,在用户端,实时验证指定长度的【负小数】的方法。HTML代码<inputtype="text"class="forc...
- 一篇文章带你用jquery mobile设计颜色拾取器
-
【一、项目背景】现实生活中,我们经常会遇到配色的问题,这个时候去百度一下RGB表。而RGB表只提供相对于的颜色的RGB值而没有可以验证的模块。我们可以通过jquerymobile去设计颜色的拾取器...
- 编程技巧:Jquery实时验证,指定长度的「正小数」
-
为了保障【正小数】的正确性,做成了通过Jquery,在用户端,实时验证指定长度的【正小数】的方法。HTML做成方法<inputtype="text"class="fo...
- jquery.validate检查数组全部验证
-
问题:html中有多个name[],每个参数都要进行验证是否为空,这个时候直接用required:true话,不能全部验证,只要这个数组中有一个有值就可以通过的。解决方法使用addmethod...
- Vue进阶(幺叁肆):npm查看包版本信息
-
第一种方式npmviewjqueryversions这种方式可以查看npm服务器上所有的...
- layui中使用lay-verify进行条件校验
-
一、layui的校验很简单,主要有以下步骤:1.在form表单内加上class="layui-form"2.在提交按钮上加上lay-submit3.在想要校验的标签,加上lay-...
- jQuery是什么?如何使用? jquery是什么功能组件
-
jQuery于2006年1月由JohnResig在BarCampNYC首次发布。它目前由TimmyWilson领导,并由一组开发人员维护。jQuery是一个JavaScript库,它简化了客户...
- django框架的表单form的理解和用法-9
-
表单呈现...
- jquery对上传文件的检测判断 jquery实现文件上传
-
总体思路:在前端使用jquery对上传文件做部分初步的判断,验证通过的文件利用ajaxFileUpload上传到服务器端,并将文件的存储路径保存到数据库。<asp:FileUploadI...
- Nodejs之MEAN栈开发(四)-- form验证及图片上传
-
这一节增加推荐图书的提交和删除功能,来学习node的form提交以及node的图片上传功能。开始之前需要源码同学可以先在git上fork:https://github.com/stoneniqiu/R...
- 大数据开发基础之JAVA jquery 大数据java实战
-
上一篇我们讲解了JAVAscript的基础知识、特点及基本语法以及组成及基本用途,本期就给大家带来了JAVAweb的第二个知识点jquery,大数据开发基础之JAVAjquery,这是本篇文章的主要...
- 推荐四个开源的jQuery可视化表单设计器
-
jquery开源在线表单拖拉设计器formBuilder(推荐)jQueryformBuilder是一个开源的WEB在线html表单设计器,开发人员可以通过拖拉实现一个可视化的表单。支持表单常用控件...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)