我是如何用IDEA调试BUG的?
最近小明的bug有点多,忙的连王者荣耀都顾不上玩了,导致现在不得不抽点时间研究一下作为当前大多Java程序员开发工具的IDEA DEBUG功能,以提高效率。
一、条件断点
场景:我们在遍历某个集合,期望程序在满足某些预设条件时停住,比如:沐芳老师在课堂上点名,需要在点到小明的时候暂停确认一下是否有人在帮小明答“到”!
那沐芳老师可以这样:

右击断点旁边的小红点(断点),弹出面板,在Condition这里填入暂停条件(返回boolean类型,一定要遵守语法哈),这样调试时,当程序满足条件时就会稳稳地停在"小明".equals(student)的位置。
二、回到"过去"
场景:人非圣贤,孰能无过。在日常开发中,大家都有手残的时候,比如在调试一个业务逻辑比较复杂,有多个方法嵌套时,一不小心手抖,断点过去了,这该怎么办?
这天,沐芳老师如往常一样在上课前点名,当点到小明的时候,不争气的小明在偷偷看喜欢的妹子,没有注意听,当反应过来时,已经错过了答到!十分懊悔(红颜祸水啊),这时小明就可以借用大雄的机器猫进行时光穿梭:

观察上图,我们看到,按照点名顺序,现在沐芳老师点名已经轮到小红,小明已经错过答到,机器猫可以这样帮助小明:点击上图红色框框圈中的Drop Frame图标(如果存在多个方法的嵌套调用,可以多点几下),就这样,小明穿越了,没有错过这次的答到:

tips:这个按钮之所以叫做Drop Frame,是因为JVM内部是以栈帧为单位来保存线程的运行状态,Drop Frame直译过来就是扔掉当前运行的栈帧,回到上一帧的位置,这样就实现了穿越。
三、多线程调试
终于老师点名结束了,现在可以正常上课了。到了同学们最爱的老师提问,同学们抢答的环节。
As we know 当我们启动多个线程时,哪个线程内的程序先执行,完全靠CPU的心情(爸爸一样的存在),这样就会造成一个问题:无法像单线程那样按照执行顺序debug。现象就是你只管打断点,线程之间不乱跳算我输,程序举例如下:

老师提出问题后,四个同学开始抢答:

这么多同学抢答,让坚守岗位30多年的沐芳老师觉得再这样下去课堂可能会有点混乱:但这并难不倒从业30多年的沐芳老师,她按如下图所示:在断点的位置上右击,选择Thread,就可以有目的地跟踪某一位同学的抢答情况(一切都在掌握之中)。

四、远程调试
大家能看到这里,小明不得不给大家介绍一个装X的技能:云调试。即本机不用启动项目,只要本机的源代码与远程服务器运行的jar包匹配,就可以在本机直接远程调试服务器上的代码!打开姿势如下:
远程项目启动时,先允许远程调试
现在大多都是SpringBoot项目,因此我们在远程服务器上运行一个jar包时
java -server -Xms512m -Xmx512m -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8080 -jar xiaoming.jar
这里起作用的核心命令就是
-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8080
远程调试从技术上讲,就是在本机与远程服务之间建立scoket通讯,所以本机要可以访问到远程服务的端口。
在idea中设置远程调试

接下来我们就可以正常调试了,调试方式和本地运行服务调试无差,不信你发起一个请求,并在对应的逻辑代码中打个断点试试?
五、临时执行表达式
再一个就是调试时,我们还可以临时执行一些表达式,点击红色框框选中的图标,然后输入你想执行的表达式,如下所示:

大家可以看到,小明心灵是多么脆弱,因为无法直面自己的实际年龄,再快要得到真实年龄是,偷偷的减去了7年,所以他实际年龄永远为18岁(手动滑稽)。
六、修改变量的运行值
当然,如果调试时,想动态修改变量的值,也很容易,在变量上右击,然后选择Set Value,比如简单粗暴的更改小明的年龄为18……

以上,这就是小明近期总结的IDEA的DEBUG技巧,希望可以帮助到大家。善用上述调试技巧,相信大家撸起代码来会更加有感觉,主要体现在:今晚可以不用加班!
代码已经提交到Github地址:https://github.com/WhenCoding/coder-xiaoming
欢迎大家关注微信公众号“程序员小明”,获取更多精彩!
我是如何用IDEA调试BUG的?的更多相关文章
- Eclipse 调试Bug之使用断点的七大技巧
		
原文链接:http://xiaohuafyle.iteye.com/blog/1705494 调试竟然有这么多技巧,亏我以前竟不知道... Eclipse这个开发工具为我们调试bug提供了非常便利 ...
 - 如何用VS调试不属于解决方案的EXE和DLL程序
		
如果你手里有一个现成的EXE, 以及EXE相关联PDB文件, 还有相关联的CPP文件和H文件. 你如何用VS调试? (当然你可以选择WinDbg.不过这里就讨论VS) 你或许想问我干嘛不从一开始就用V ...
 - Eclipse调试Bug的七种常用技巧(转)
		
注意事项及小结: (1)Line Breakpoint:如果设置Conditional,监控的变量需要比当前行高一级block,譬如for(int i=0;i<20;i++)中的i,fo ...
 - 如何用 fiddler 调试线上代码
		
有时代码上线了,突然就碰到了坑爹的错误.或者有时看别人家线上的代码,对于一个文件想 fork 下来试试效果又不想把全部文件拉到本地,都可以使用 fiddler 的线上调试功能. 比方说我们打开携程的首 ...
 - 从durable谈起,我是如何用搜索引擎抓住技术的关键字学习新姿势打开敏捷开发的大门
		
---又名我讨厌伸手党 我又把个人博客的子标题改为了 你可以在书和搜索引擎找到90%的问题的答案,为什么要问别人?剩下的10%或许没有答案,为什么要问别人? 这是由于最近在网上看到各种伸手,对于我这种 ...
 - ZCU板级调试Bug记录
		
本帖用以记录在ZCU102板级调试间遇到的Bug. 1.PL端的AXI总线在读取DDR中的数据的时候,在一个burst内不能跨越page boundary.跨越page boundary会在该burs ...
 - 调试bug 技巧
		
两天,一个小bug 我调试了两天,最终调试成功了.还是在别人的帮助下. 问题是刷新相关的.当用户登录了,其他的页面都要刷新.也就是加上一些参数. 但是有一个fragment一直加不上,其他挨着的两个都 ...
 - 线上调试bug
		
在以往的工作中,线上一有bug,就需要把文件弄到本地来改,但经常会碰见本地环境又和线上不一样,导致调试困难,闭着眼睛改好之后传到线上去看对不对,不对的话又要改,循环往复,要多麻烦就有多麻烦啊. 今天给 ...
 - 如何用 pycharm 调试 airflow
		
airflow 和 pycharm 相关基础知识请看其他博客 我们在使用 airflow的 dag时. 每次写完不知道对不对的,总不能到页面环境中跑一下,等到报错再调试吧.这是很让人恼火的事情 这里我 ...
 
随机推荐
- Shopee招聘-测试开发leader(30k-60k/月)
			
内推邮箱:tim.zhao@shopee.com 地点:深圳 1.测试Leader (30k-60k/月) 岗位职责 负责根据项目计划制订测试计划和规划,保证项目质量和进度: 负责与产品经理和开发人员 ...
 - 对话|人工智能先驱Yoshua Bengio
			
  Bengio"> 今年1月份,微软收购深度学习初创公司Maluuba时,Maluuba公司德高望重的顾问.深度学习先驱Yoshua Bengio也接手了微软的人工智能研究顾问 ...
 - Vue源码之组件化/生命周期(个人向)
			
大致流程 具体流程 组件化 (createComponent) 构造⼦类构造函数 const baseCtor = context.$options._base // plain options ob ...
 - webpack环境配置2
			
1.webpack安装 Step 1: 首先安装Node.js, 在1中已经详细介绍了. Step2: 在Git或者cmd中输入下面这段代码, 通过全局先将webpack指令安装进电脑中npm ins ...
 - 一行python代码搞定文件分享
			
给同事分享文件,如你所知通过聊天工具,网盘或linux命令各种方法,还有一个也可以尝试下:使用一行python代码快速搭建一个http服务器在局域网内进行下载. python3使用: python3 ...
 - JDBC阶段总结
			
一.JDBC的概念:Java DataBase Connectivity用Java语言操作数据库(通过SQL)二.数据库的驱动和JDBC的关系三.编写JDBC的步骤: a.注册驱动 b.建立与数据库的 ...
 - js变量提升、函数提升详解
			
一.变量提升是指将变量声明提升到它所在作用域的最开始部分 console.log(a) // 为什么会出现以上的结果,是因为js的变量提升,将a变量的声明提升到全局作用域的最上面部分,实际代码如下: ...
 - All In One
			
set1 https://github.com/tianhang-f... set2 https://github.com/tianhang/F... set3https://github.com/t ...
 - angularV4+学习笔记
			
angular学习笔记之组件篇 1注解 1.1组件注解 @Component注解,对组件进行配置. 1.1.1注解@Component的元数据 selector template/templateUr ...
 - Python学习笔记--迭代
			
在Python中,迭代是通过for ... in来实现.只要是可迭代的对象都可以用for ... in来进行历遍. 常用的有list.tuple.dict等.举例如下: 列表的迭代: L=[1,2,3 ...