百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

IDEA 断点(高级) idea中断点调试

yuyutoo 2024-10-12 01:52 7 浏览 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. 远程调试

  1. 打开Idea的 Run/Debug Configurations 新增一个Remote。 JVM参数添加 -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
  2. 远程项目启动添加参数:java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar xxx.jar
  3. idea启动remote,并打断点调试

7. 生产环境建议

1. 使用断点进行 "printf "调试
使用非暂停的日志断点,而不是在代码中插入打印语句。这为处理调试日志信息提供了一种更灵活和集中的方式。

场景:所有需要打印的地方,生产上禁止 System.out.print();

2. 调试无响应的应用程序
如果你的应用程序挂起,暂停会话,让调试器获得关于其当前状态的信息。然后你可以检查程序的状态并找出问题的原因。

场景:项目启动卡死等处理

3. 测试你的程序是否有并发性问题
发现多线程程序在并发方面是否健壮的一个好方法是使用断点,在碰到时只暂停一个线程。停止一个线程可能会揭示出应用程序设计中的问题,否则这些问题就不会显现出来。

相关推荐

当 Linux 根分区 (/) 已满时如何释放空间?

根分区(/)是Linux文件系统的核心,包含操作系统核心文件、配置文件、日志文件、缓存和用户数据等。当根分区满载时,系统可能出现无法写入新文件、应用程序崩溃甚至无法启动的情况。常见原因包括:...

玩转 Linux 之:磁盘分区、挂载知多少?

今天来聊聊linux下磁盘分区、挂载的问题,篇幅所限,不会聊的太底层,纯当科普!!1、Linux分区简介1.1主分区vs扩展分区硬盘分区表中最多能存储四个分区,但我们实际使用时一般只分为两...

Linux 文件搜索神器 find 实战详解,建议收藏

在Linux系统使用中,作为一个管理员,我希望能查找系统中所有的大小超过200M文件,查看近7天系统中哪些文件被修改过,找出所有子目录中的可执行文件,这些任务需求...

Linux 操作系统磁盘操作(linux 磁盘命令)

一、文档介绍本文档描述Linux操作系统下多种场景下的磁盘操作情况。二、名词解释...

Win10新版19603推送:一键清理磁盘空间、首次集成Linux文件管理器

继上周四的Build19592后,微软今晨面向快速通道的Insider会员推送Windows10新预览版,操作系统版本号Build19603。除了一些常规修复,本次更新还带了不少新功能,一起来了...

Android 16允许Linux终端使用手机全部存储空间

IT之家4月20日消息,谷歌Pixel手机正朝着成为强大便携式计算设备的目标迈进。2025年3月的更新中,Linux终端应用的推出为这一转变奠定了重要基础。该应用允许兼容的安卓设备...

Linux 系统管理大容量磁盘(2TB+)操作指南

对于容量超过2TB的磁盘,传统MBR分区表的32位寻址机制存在限制(最大支持2.2TB)。需采用GPT(GUIDPartitionTable)分区方案,其支持64位寻址,理论上限为9.4ZB(9....

Linux 服务器上查看磁盘类型的方法

方法1:使用lsblk命令lsblk输出说明:TYPE列显示设备类型,如disk(物理磁盘)、part(分区)、rom(只读存储)等。...

ESXI7虚机上的Ubuntu Linux 22.04 LVM空间扩容操作记录

本人在实际的使用中经常遇到Vmware上安装的Linux虚机的LVM扩容情况,最终实现lv的扩容,大多数情况因为虚机都是有备用或者可停机的情况,一般情况下通过添加一块物理盘再加入vg,然后扩容lv来实...

5.4K Star很容易!Windows读取Linux磁盘格式工具

[开源日记],分享10k+Star的优质开源项目...

Linux 文件系统监控:用脚本自动化磁盘空间管理

在Linux系统中,文件系统监控是一项非常重要的任务,它可以帮助我们及时发现磁盘空间不足的问题,避免因磁盘满而导致的系统服务不可用。通过编写脚本自动化磁盘空间管理,我们可以更加高效地处理这一问题。下面...

Linux磁盘管理LVM实战(linux实验磁盘管理)

LVM(逻辑卷管理器,LogicalVolumeManager)是一种在Linux系统中用于灵活管理磁盘空间的技术,通过将物理磁盘抽象为逻辑卷,实现动态调整存储容量、跨磁盘扩展等功能。本章节...

Linux查看文件大小:`ls`和`du`为何结果不同?一文讲透原理!

Linux查看文件大小:ls和du为何结果不同?一文讲透原理!在Linux运维中,查看文件大小是日常高频操作。但你是否遇到过以下困惑?...

使用 df 命令检查服务器磁盘满了,但用 du 命令发现实际小于磁盘容量

在Linux系统中,管理员或开发者经常会遇到一个令人困惑的问题:使用...

Linux磁盘爆满紧急救援指南:5步清理释放50GB+小白也能轻松搞定

“服务器卡死?网站崩溃?当Linux系统弹出‘Nospaceleft’的红色警报,别慌!本文手把手教你从‘删库到跑路’进阶为‘磁盘清理大师’,5个关键步骤+30条救命命令,快速释放磁盘空间,拯救你...

取消回复欢迎 发表评论: