当前位置: 首页 > news >正文

在IDEA中的DeBug调试技巧

一、条件断点

循环中经常用到这个技巧,例如:遍历1个List的过程中,想让断点停在某个特定值。

参考上图,在断点的位置,右击断点旁边的红点,会出来1个界面,在Condition这里填写断点条件即可,这样调试时,就会停在i=10的位置

 

、回到"上一步"

该技巧最适合特别复杂的方法嵌套的场景,好不容易跑起来,一不小心手一抖,断点过去了,想回过头看看刚才的变量值,如果不知道该技巧,只能再跑一遍。

参考上图,method1方法调用method2,当前断点的位置j=100,点击上图红色箭头位置的Drop  Frame图标后,时间穿越了 

回到了method1刚开始调试的时候,变量i变成了99,没毛病吧,老铁们,是不是很6 :)

注:好奇心是人类进步的阶梯,如果想知道为啥这个功能叫Drop Frame,并不是类似Back To Previous 之类的,可以去翻翻 JVM的书,JVM内部以栈帧为单位保存线程的运行状态,drop frame即扔掉当前运行的栈帧,这样当前“指针”的位置,就当然到了上一帧的位置。

三、多线程调试

多线程同时运行时,谁先执行,谁后执行,完全是看CPU心情的,语法控制先后,运行时可能没什么问题,但是调试时就比较麻烦了,最明显的就是断点乱跳,一会停这个线程,一会停在另一个线程,如下图:

如果想希望下一个断点位置是第2句诗句,可能要失望了

如果想让线程在调试时,想按我们的愿意来,让它停在哪个线程就停在哪个线程,可以在图中3个断点的红点上右击,

即:Suspend挂起的条件是按每个线程来,All。把这3个断点都这么设置后,再来一发试试

注意上图中的红框位置,断点停下来时,这个下拉框可以看到各个线程(注:给线程起个容易识别的名字是个好习惯!),我们可以选择线程“天空中的飞鸟”

断点如愿停在了第2句诗。

四、远程调试

这也是一个装B的利器,本机不用启动项目,只要有源代码,可以在本机直接远程调试服务器上的代码,打开姿势如下:

项目启动时,先允许远程调试

-server -Xms512m -Xmx512m -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=

起作用的就是

-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=9081

注意:远程调试从技术上讲,就是在本机与远程建⽴scoket通讯,所以端⼝不要冲突,而且本机要允许访问远程端⼝,另外这一段参数,放要在-jar 或 ${main_class}的前面

Idea中设置远程调试

然后就可以调试了

前提是本机有项目的源代码 ,在需要的地方打个断点,然后访问这个远程的url试试,断点就会停下来。 

五、临时执行表达式/修改变量的运行值

调试时,可以临时执行一些表达式,参考下图:点击这几个图标中的任何1个都可以

点击+号后,就可以在新出现的输话框口输入表达式,例如i+5

 然后回车,马上就能看到结果

当然,如果调试时,想动态修改变量的值,也很容易,在变量上右击,然后选择Set Value,剩下的事,地球人都知道。

善长上述调试技巧,相当大家撸起代码来会更有感觉,祝大家工作愉快!

相关文章:

  • 酷柚易汛ERP - 盘点操作指南
  • 【数据结构】图的深度优先遍历
  • 参考文献格式
  • 【技术追踪】SAM(Segment Anything Model)代码解析与结构绘制之Mask Decoder
  • 蓝桥杯 map
  • 【数据库】数据库连接池导致系统吞吐量上不去-复盘
  • 麒麟 ZYJ 服务器软件适配 参考示例
  • openGauss学习笔记-124 openGauss 数据库管理-设置账本数据库-查看账本历史操作记录
  • 第五章 树和二叉树(上)【基本概念性质和二叉树遍历】
  • 算法升级之路(七)-盛最多水的容器
  • 2023-11-17 VsCode使用makefile进行多文件编译
  • 基于Element-Plus动态配置Menu 菜单栏
  • Windows Server 2012 R2系统服务器远程桌面服务多用户登录配置分享
  • 2023-11-18 Android Linux资源限制命令 ulimit,比如ulimit -d 是设置进程占用的最大数据段大小,默认是unlimited。
  • Spring Boot 中使用 ResourceLoader 加载资源的完整示例
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • Mocha测试初探
  • mysql_config not found
  • php面试题 汇集2
  • Spring Boot MyBatis配置多种数据库
  • 从tcpdump抓包看TCP/IP协议
  • 对JS继承的一点思考
  • 工作手记之html2canvas使用概述
  • 计算机常识 - 收藏集 - 掘金
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • ionic异常记录
  • Nginx实现动静分离
  • 仓管云——企业云erp功能有哪些?
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​油烟净化器电源安全,保障健康餐饮生活
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • $.ajax()方法详解
  • (zhuan) 一些RL的文献(及笔记)
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (三)mysql_MYSQL(三)
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • 、写入Shellcode到注册表上线
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .net(C#)中String.Format如何使用
  • @基于大模型的旅游路线推荐方案
  • [ C++ ] STL---string类的使用指南
  • [100天算法】-实现 strStr()(day 52)
  • [AR]Vumark(下一代条形码)
  • [AutoSar NVM] 存储架构
  • [BJDCTF2020]The mystery of ip1
  • [C#基础]说说lock到底锁谁?
  • [Java][Android][Process] 暴力的服务能够解决一切,暴力的方式运行命令行语句
  • [javascript]Tab menu实现
  • [leetcode 数位计算]2520. 统计能整除数字的位数
  • [ruby on rails]rack-cors, rack-attack
  • [shell] while read line 与for循环的区别
  • [SQL]实现按照指定分割分分割字符串