亲宝软件园·资讯

展开

我是如何用IDEA调试BUG的?

Coder小明 人气:0
> 最近小明的bug有点多,忙的连王者荣耀都顾不上玩了,导致现在不得不抽点时间研究一下作为当前大多Java程序员开发工具的IDEA DEBUG功能,以提高效率。 ### 一、条件断点 > 场景:我们在遍历某个集合,期望程序在满足某些预设条件时停住,比如:沐芳老师在课堂上点名,需要在点到小明的时候暂停确认一下是否有人在帮小明答“到”! 那沐芳老师可以这样: ![](https://img2020.cnblogs.com/other/1669068/202003/1669068-20200330123749387-20462710.jpg) 右击断点旁边的小红点(断点),弹出面板,在**Condition**这里填入暂停条件,这样调试时,当程序满足条件时就会稳稳地停在`student= "小明"`的位置。 ### 二、回到"过去" > 场景:人非圣贤,孰能无过。在日常开发中,大家都有手残的时候,比如在调试一个业务逻辑比较复杂,有多个方法嵌套时,一不小心手抖,断点过去了,这该怎么办? 这天,沐芳老师如往常一样在上课前点名,当点到小明的时候,不争气的小明在偷偷看喜欢的妹子,没有注意听,当反应过来时,已经错过了答到!十分懊悔(红颜祸水啊),这时小明就可以借用大雄的机器猫进行时光穿梭: ![](https://img2020.cnblogs.com/other/1669068/202003/1669068-20200330123749747-1002357522.png) 观察上图,我们看到,按照点名顺序,现在沐芳老师点名已经轮到小红,小明已经错过答到,机器猫可以这样帮助小明:点击上图红色框框圈中的**Drop Frame**图标(如果存在多个方法的嵌套调用,可以多点几下),就这样,小明穿越了,没有错过这次的答到: ![](https://img2020.cnblogs.com/other/1669068/202003/1669068-20200330123750095-80391186.png) **tips**:这个按钮之所以叫做**Drop Frame**,是因为**JVM**内部是以**栈帧**为单位来保存线程的运行状态,**Drop Frame**直译过来就是扔掉当前运行的栈帧,回到上一帧的位置,这样就实现了穿越。 ### 三、多线程调试 > 终于老师点名结束了,现在可以正常上课了。到了同学们最爱的老师提问,同学们抢答的环节。 As we know 当我们启动多个线程时,哪个线程内的程序先执行,完全靠CPU的心情(爸爸一样的存在),这样就会造成一个问题:无法像单线程那样按照执行顺序debug。现象就是你只管打断点,线程之间不乱跳算我输,程序举例如下: ![](https://img2020.cnblogs.com/other/1669068/202003/1669068-20200330123750393-67131359.png) 老师提出问题后,四个同学开始抢答: ![](https://img2020.cnblogs.com/other/1669068/202003/1669068-20200330123750663-441017599.png) 这么多同学抢答,让坚守岗位30多年的沐芳老师觉得再这样下去课堂可能会有点混乱:但这并难不倒从业30多年的沐芳老师,她按如下图所示:在断点的位置上右击,选择**Thread**,就可以有目的地跟踪某一位同学的抢答情况(一切都在掌握之中)。 ![](https://img2020.cnblogs.com/other/1669068/202003/1669068-20200330123750914-667735706.png) ### 四、远程调试 大家能看到这里,小明不得不给大家介绍一个装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中设置远程调试 ![](https://img2020.cnblogs.com/other/1669068/202003/1669068-20200330123751479-1531211333.png) 接下来我们就可以正常调试了,调试方式和本地运行服务调试无差,不信你发起一个请求,并在对应的逻辑代码中打个断点试试? ### 五、临时执行表达式 再一个就是调试时,我们还可以临时执行一些表达式,点击红色框框选中的图标,然后输入你想执行的表达式,如下所示: ![](https://img2020.cnblogs.com/other/1669068/202003/1669068-20200330123752167-569808286.png) 大家可以看到,小明心灵是多么脆弱,因为无法直面自己的实际年龄,再快要得到真实年龄是,偷偷的减去了7年,所以他实际年龄永远为18岁(手动滑稽)。 ### 六、修改变量的运行值 当然,如果调试时,想动态修改变量的值,也很容易,在变量上右击,然后选择**Set Value**,比如简单粗暴的更改小明的年龄为18…… ![](https://img2020.cnblogs.com/other/1669068/202003/1669068-20200330123752819-1393911882.png) 以上,这就是小明近期总结的IDEA的DEBUG技巧,希望可以帮助到大家。善用上述调试技巧,相信大家撸起代码来会更加有感觉,主要体现在:今晚可以不用加班!

加载全部内容

相关教程
猜你喜欢
用户评论