idea10个常用的Debug技巧

news2024/11/14 19:52:12

文章目录

    • 一 回到上一步
    • 二 字段断点
    • 三 Stream调试
    • 四 表达式结果查看
    • 五 debug筛选条件
    • 六 异常断点
    • 七 远程调试
    • 八 强制返回
    • 九 运行时修改变量
    • 十 多线程调试
    • 重用快捷键

一 回到上一步

进行代码调试的过程中,有的时候由于自己点击下一步的速度比较快,可能之前打的断点命中后直接跳过去了进入到某个方法的内部,但是我们还是想看回头看之前断点中的情况,那么此时可以使用这个回到上一步功能即Drop Frame,快速定位到之前的代码运行位置。我们都知道JVM通过栈帧保存方法调用地址的,因此实际上这部分的功能可以理解为舍弃当前的调用栈回到原来的调用处。

图片

二 字段断点

当我们需要知道类中某个属性值到底什么时候被修改的时候,如果要从最起始的地方进行调试实在太过麻烦,因为有的时候我们可能并不知道属性赋值的起始点到底在哪里,特别是在阅读框架源码的时候。那么此时可以尝试在类的字段进行断点,勾选上在属性访问或者属性修改的时候将运行到属性修改发生的地方或者属性被访问的地方,这样可以大大提高我们找到属性修改再沈地方被修改的效率。

图片

三 Stream调试

Lambda表达式是JDK1.8的新特性,在实际的项目编码也会被经常使用到来简化一些循环操作的代码。但是Lambda表达式并不好进行调试,因此不太方便查看stream流内部的值运行情况,此时我们需要借助于Java Stream Debuger这个插件,这样我们在进行stream流debug的时候就可以看到内部各个值执行的流程以及最终结果,方便我们进行问题定位。

图片

四 表达式结果查看

在进行Debug的过程中,在代码的右侧一般会默认展示一些变量当前的值,但是对于一些表达式的值并不会默认展示,而我们有的时候需要关注一下表达式在计算过程中的数据是否正确。此时便可以通过鼠标选中需要计算的代码表达式然后结合(Alt+F8)快捷键查看表达式的计算结果。

图片

五 debug筛选条件

在一些循环条件中,比如某个List中有100个String对象,但是我们在调试的时候希望快速找到满足条件的对象,而不是在不关注的对象上面浪费时间进行debug,这个时候我们就可以使用debug筛选条件快速过滤出我们需要的对象,大大提升我们debug的效率。

图片

六 异常断点

进行断点调试的时候,除了阅读框架源码理解技术原理或者熟悉新业务,大部分情况进行断点调试都是出现了异常需要进一步定位具体原因。但是一般情况下当发生异常的时候,抛出来的异常要么被框架捕捉了,进入框架的源码当中,要么被自己业务代码中的try catch捕捉了,影响问题定位。因此我们想要当异常发生的时候可以停在抛异常的地方,方便我们进行问题定位。

1、在任意断点处点击鼠标右键进行更多debug设置,找到Java Exception Breakpoints添加自带的Exception类型或者自定义的业务异常。

图片

2、此时进入debug模式运行代码,当代码逻辑产生之前添加的异常类型后,代码会停留在发生异常的地方,这样异常调试就更加方便了。

在这里插入图片描述

七 远程调试

在实际的项目开发中,经常会遇到本地调试没毛病,但是部署到预发布环境或者生产环境中就会出现Bug的问题,这个时候我们只能通过远程调试来具体定位问题到底是什么。

1、在debug模式配置中选择Remote模式

图片

2、配置远程环境

图片

服务以Jar形式运行

在服务启动的时候需要增加启动参数

 java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar business.jar 

服务在Tomcat容器中

tomcat 的bin目录下的catalina.sh文件中增加配置

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

服务在Docker容器中

需要在dockerfile配置ENTRYPOINT,也就是服务的启动参数。

注意:
远程调试需要确保本地代码合远程代码的完全一致,否则代码行数匹配不上无法达到调试的效果。

八 强制返回

我们进行debug问题排查,有的时候只是想确认业务逻辑有没有问题,并不想真正去执行一些耗费资源、或者改变数据的操作,那么在这种场景下,我们可以借助于强制返回的功能,不执行方法后面的代码而指定一个返回值来继续后续的业务逻辑debug。

图片

从运行结果可以看得出来,加法的代码逻辑实际并没有执行,而是通过强制返回后直接执行了后面的业务逻辑。

图片

九 运行时修改变量

在debug的过程中,有时候我们需要按照我们预想的逻辑进行问题排查定位,这种场景下我们可能需要修改某些变量的值以便于代码走入不同的预想的业务逻辑。通过Alt + F8快捷键修改获取指定变量的值,右键Set Value设置新的值。

图片

输入新的变量值后进行回车设置,如此变量值被改变了,原先的业务逻辑发在条件发生改变之后也发生了改变。

图片

十 多线程调试

Idea默认的Debug模式下会阻塞所有的线程,只有当当前的调试线程逻辑走完之后才会进入其他的线程。那如果想要调试多线程场景下的业务逻辑应该怎么办呢? 实际上在设置断点的时候,鼠标右击断点,我们可以选择Thread调试模式。

图片

这样我们在Debugger中就可以通过切换不同的线程来进行业务逻辑调试。

图片

重用快捷键

  1. F8:Step Over 程序执行到下一步
  2. F7:Step Into 进入方法内部
  3. Alt+Shift+F7:强制进入方法内部,主要针对F7无法进入的方法内部的情况
  4. Shift+F8:进入方法之后,不希望再一步步执行剩下的代码,可以通过此快捷键跳出
    图片
  5. Alt+F10:如果当前鼠标光标不在代码运行处,通过此快捷键可以将光标回归到代码运行处
  6. Alt+F9:鼠标光标在何处,可以直接通过此快捷键跳转运行到光标处,无需断点
  7. Alt+F8:计算表达式的值,用鼠标选择需要计算的表达式之后,通过此快捷键可以计算表达式的值图片
  8. Ctrl+F5:比如改了某些代码需要重新运行程序,可以使用此快捷键
  9. F9:如果一段代码中打了两个断点,当debug到第一个断点后,按F9后代码运行到第二个断点处,如果再按F9则执行完所有的代码,也就是说如果当前断点后还有断点则可以通过F9跳转,如果没有则执行完代码逻辑。
  10. Ctrl+Shift+F8:查看所有的当前所有的断点

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/57493.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

世界连续动作预测模型-方向模型

🍿*★,*:.☆欢迎您/$:*.★* 🍿 正文 <

[附源码]Python计算机毕业设计Django基于java的社区管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

云原生k8s的金箍棒

如果云原生是我们喜欢的《西游记》中孙悟空&#xff0c;那Autoscaling就是云原生手中的金箍棒。想象一下&#xff0c;没有金箍棒的孙悟空&#xff0c;还能到处降妖伏魔么&#xff1f;还能成为斗战圣佛吗&#xff1f; Autoscaling 根据需要随时动态扩缩容&#xff0c;有了它&…

TsingHua:FPT: Improving Prompt Tuning Efficiency via Progressive Training

这篇文章我觉得做的也挺有意思的。 是在探究提示学习中渐进式的更新参数比一窝蜂的直接更新参数效果要佳。 开头 是从比较PT&#xff08;prompt learning和fine tuning&#xff09;开始的。为什么PT的收敛速度慢&#xff0c;训练效率低下&#xff1f; 因为PT中中可训练的参数…

[附源码]计算机毕业设计新冠疫苗接种预约系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

第15章 基数法则

第15章 基数法则 15.1 通过其他计数来计算当前计数 如何计算拥挤的房间里有多少人?你可以数人头&#xff0c;因为一个人就只有一个头。或者&#xff0c;也可以数耳朵&#xff0c;然后除以2。我们往往可以通过对其他事物计数进而计算当前计数。 最直截了当的通过查找一种事物…

Kotlin高仿微信-第34篇-支付-向商家付款(二维码)

Kotlin高仿微信-项目实践58篇详细讲解了各个功能点&#xff0c;包括&#xff1a;注册、登录、主页、单聊(文本、表情、语音、图片、小视频、视频通话、语音通话、红包、转账)、群聊、个人信息、朋友圈、支付服务、扫一扫、搜索好友、添加好友、开通VIP等众多功能。 Kotlin高仿…

这么简单,还不会使用java8 stream流的map()方法吗?

一、前言 在日常的开发工作中经常碰到要处理list中数据的问题&#xff0c;比如从数据库中查出了很多学生&#xff0c;由于一些原因需要在内存中找出这些学生中的所有姓名&#xff0c;或者把名为“王五”的语文成绩暂时修改为“100”&#xff0c;这些问题怎么处理呐&#xff0c…

初始C语言-1(数据类型、变量、常量、变量的作用域和生命周期、字符串+转义字符+注释)

目录 一、C语言 C语言主要运用于底层&#xff0c;也可以运用于上层软件&#xff08;早期还没有其他的语言的时候&#xff0c;很多游戏就是C语言做的&#xff09; C语言发展至今都是排行前三的计算机语言。 随着物联网&#xff0c;万物互联&#xff0c;以及嵌入式开发和单片机…

Java 面向对象的【三大特征】,你都掌握了吗

文章目录前言一、封装1.封装的概念2.访问修饰限定符3.初识 “ 包 ”4. static 成员static修饰成员变量static修饰成员方法static成员初始化二、继承1.为什么要继承2.继承的概念3.语法4.父类成员访问1.子类中访问父类的成员变量2.子类中访问父类的成员方法5. super 关键字6. 子类…

RabbitMQ之单机多实例部署

单机版安装前面介绍过了&#xff0c;不再介绍。 此处在单机版基础上 &#xff0c;也就是一台Linux虚拟机上启动多个RabbitMQ实例&#xff0c;部署集群。 1、在单个Linux虚拟机上运行多个RabbitMQ实例&#xff1a; 多个RabbitMQ使用的端口号不能冲突多个RabbitMQ使用的磁盘存…

李宏毅《DLHLP》学习笔记6 - 语言模型

视频链接&#xff1a;https://www.youtube.com/watch?vdymfkWtVUdo&listPLJV_el3uVTsO07RpBYFsXg-bN5Lu0nhdG&index8&ab_channelHung-yiLee 课件链接&#xff1a;https://speech.ee.ntu.edu.tw/~tlkagk/courses/DLHLP20/ASR3.pdf 1. Language Model LM的作用是预…

嵌入式Linux 开发经验:注册一个 misc 设备

前言 之前买过好几本Linux 设备驱动的书&#xff0c;不过对设备驱动一知半解&#xff0c;什么叫设备&#xff0c;什么又叫驱动&#xff1f;最近工作需要&#xff0c;从源码级别深入的研究了一下 Linux 下的设备与驱动的概念&#xff0c;略有所收获 一般提起驱动开发&#xff0…

[附源码]Python计算机毕业设计Django基于Java的图书购物商城

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

visual stduio code 配置高效舒适web生产环境

与webstrom 之前写了一篇webstorm的配置&#xff0c;参考同学的建议&#xff0c;vscode可能使用的人更多&#xff0c;所以配置了一个vs来试用看看。 一直用不习惯的是全文搜索&#xff0c;还是更喜欢webstrom弹窗式的&#xff0c;还可以显示上下文。包括其他的配置&#xff0…

第二证券|小鹏持续萎靡,理想蔚来逆势反弹破月销记录

12月1日&#xff0c;多家造车新势力先后公布11月销量数据。跟着“银十”出售旺季热度淡去&#xff0c;新势力品牌销量也受轿车零售商场逐渐冷却影响出现整体下滑。接连稳居榜首的埃安、哪吒等品牌均出现4位数以上环比销量下滑。上月商场体现低迷的抱负与蔚来则逆势添加&#xf…

TensorFlow之文本分类算法-6

1 前言 2 收集数据 3 探索数据 4 选择模型 5 准备数据 6 模型-构建训练评估 构建输出层 构建n-gram模型 构建序列模型 GloVe&#xff08;英文全称是Global Vectors for Word Representation&#xff09;是一个全球化的英语语境的单词表示的向量集&#xff0c;其使用非…

新变化新营销 这些知识点你得 Get!(文末有 PPT 福利首次放送)

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 在刚刚结束的第 7 期火山引擎数智平台 VeDI「增长课堂」上&#xff0c;火山引擎数智平台 VeDI 零售行业解决方案、汽车行业解决方案团队&#xff0c;以及慢慢买平台…

LM2903VQPWRQ1比较器 LM73C0QDDCRQ1传感器的中文资料

1、LM2903-Q1双路差分比较器包含两个独立的电压比较器&#xff0c;这些比较器可在宽电压范围内由单电源供电运行。如果两个电源之间的电压差在2V至36V且VCC比输入共模电压至少高1.5V以上&#xff0c;那么它们也可以由双电源供电运行。电流消耗不受电源电压的影响。可将输出连接…

一文带你深入理解【Java基础】· Java集合(下)

写在前面 Hello大家好&#xff0c; 我是【麟-小白】&#xff0c;一位软件工程专业的学生&#xff0c;喜好计算机知识。希望大家能够一起学习进步呀&#xff01;本人是一名在读大学生&#xff0c;专业水平有限&#xff0c;如发现错误或不足之处&#xff0c;请多多指正&#xff0…