80%的程序员不了解的调试技巧

程序员的工做内容,除了大部分时间写代码以外,由于有很多的时间是用在调试代码上。甚至说不是在调试代码,就是即将调试代码。 :)java

今天咱们来谈谈调试代码的一些技巧,在使用IDE提供的debugger时一些快速定位问题的方式。程序员

看到这里的朋友,不要立刻认为我标题党,再往下看看,若是你还有一些更好用的技巧,欢迎留言。面试

下面进入正题。安全

1 多线程调试多线程

开发过多线程应用的朋友应该有体会,有些时候,为了观察多个线程间变量的不一样状态,以及锁的获取等,就会想到在代码里加个断点debug一下。架构

在IDE里断点停下来的时候,能够切换到另外的线程中,跑其余的代码,不会互相影响。固然,这里是有个开关的,在Eclipse里默认开启,框架

可是在IntelliJ IDEA里默认是没有开启的。也就是说若是你在IDEA里代码里加断点,虽然一个线程的断了下来,但其余线程的已经执行过了。此处把线程的suspend设置成和Eclipse模式同样以后,也能够开始多线程应用的调试。简单设置能够直接在断点处,将suspend改为Thread分布式

一个线程断下来以后,能够经过在线程窗口切换,到其它线程中继续运行。源码分析

IntelliJ IDEA里在这儿切换性能

咱们看到main线程和pool-1-thread-1这两个线程都处于RUNNING状态,切换到任何一个均可以继续运行。

此时,就能够写一个多线程的应用,同时向ArryList这一类非线程安全的容器中存放内容,而后观察为何他们是线程不安全的,会出现什么问题,生动又形象。

PS: 这里顺道说一下,这就是为何建立线程时建议起一个有意义的名字,至少是能够识别的名字,不然在这里都不能区分出哪一个是本身的线程,想切换还麻烦。

2 后退执行

这里所说的后退执行,是有些时候咱们在debug代码时,懒的每一个方法都进入单步调试,就会出现你观察一个变量值的变化时,某个方法没跟进去,结果值就变了,不得不重来一次

依靠后退执行的功能,能够后退,就像下棋时悔棋那种功能同样。固然,这个后退招待的名字是我本身起的,在IDE里被称为Drop Frame

有了这个功能,咱们在Drop 了当前这个Frame以后,已经改变的变量值不会恢复。好比你向当前调用方法里传入了一个List,而且在方法中向List里添加了内容,那在Drop到调用该方法的地方时,List不会恢复到以前的状态。

可是在该方法再次被调用时,你能够观察List何时被改变的,至少不须要再重跑一遍程序了。甚至你能够一言不合就后退。

3 条件断点

为了调试代码,就须要在要观察变动的地方添加断点,而后当心翼翼的一步步执行。可是若是是在一个循环里,又或者该方法会被多线程同时调用到的时候,你当心的向下单步调试,发现没有你关心的内容,又从循环开始处跑下来,仍是没你的内容,人就开始烦燥起来。

其实,在添加断点的时候,咱们能够为断点增长必定的条件,这样,在指定的条件知足时,断点才会生效。

IntelliJ IDEA内,在断点上右击,会弹出以下图的条件框,输入指定的条件便可。

有了这个功能,咱们在Drop 了当前这个Frame以后,已经改变的变量值不会恢复。好比你向当前调用方法里传入了一个List,而且在方法中向List里添加了内容,那在Drop到调用该方法的地方时,List不会恢复到以前的状态。

可是在该方法再次被调用时,你能够观察List何时被改变的,至少不须要再重跑一遍程序了。甚至你能够一言不合就后退。

3 条件断点

为了调试代码,就须要在要观察变动的地方添加断点,而后当心翼翼的一步步执行。可是若是是在一个循环里,又或者该方法会被多线程同时调用到的时候,你当心的向下单步调试,发现没有你关心的内容,又从循环开始处跑下来,仍是没你的内容,人就开始烦燥起来。

其实,在添加断点的时候,咱们能够为断点增长必定的条件,这样,在指定的条件知足时,断点才会生效。

IntelliJ IDEA内,在断点上右击,会弹出以下图的条件框,输入指定的条件便可。

有了条件断点,不相关,不感兴趣的代码就能够直接跳过了。

4 片段代码

这个没想好用什么名字来表述。有些时候在调试过程当中,突然想招待一段与此相关,但不在源文件中的代码来观察一下,辅助进行问题分析。此时你会中止程序,添加代码而后从新跑一次吗?

在IDEA里有一个执行代码片段的功能,能够在当前代码的上下文内,执行你临时写的代码。

例如,当前方法传入一个List,但这个方法里少一个你后面条件须要使用到的元素,此时你能够临时使用片段代码执行的功能,添加一个进去。

注意,在IntelliJ IDEA里,这个上面红框,像个小计算器的按钮就是临时执行的功能,点击以后,会弹出按钮下方这个Evaluate Expression的框,输入代码,点击右下角的Evalute便可。返回值会显示在Result处。

这就就至关于临时改变了变量内容。

而后,还能够调用对象的方法,执行功能,获取属性值等。

5 查看变量修改值

每一个IDE在调试代码时都提供了一个观察当前上下文变量值的窗口。其实除了查看以外,一些非final的基本类型,还能够直接在此处修改值。这样若是屡次循环执行时,每次能够恢复到指望的值,不须要重启程序。

加Java架构师群获取Java工程化、高性能及分布式、高性能、深刻浅出。高架构。性能调优、Spring,MyBatis,Netty源码分析和大数据等多个知识点高级进阶干货的直播免费学习权限 都是大牛带飞 让你少走不少的弯路的 群..号是:855801563 对了 小白勿进 最好是有开发经验

注:加群要求

一、具备工做经验的,面对目前流行的技术不知从何下手,须要突破技术瓶颈的能够加。

二、在公司待久了,过得很安逸,但跳槽时面试碰壁。须要在短期内进修、跳槽拿高薪的能够加。

三、若是没有工做经验,但基础很是扎实,对java工做机制,经常使用设计思想,经常使用java开发框架掌握熟练的,能够加。

四、以为本身很牛B,通常需求都能搞定。可是所学的知识点没有系统化,很难在技术领域继续突破的能够加。

5.阿里Java高级大牛直播讲解知识点,分享知识,多年工做经验的梳理和总结,带着你们全面、科学地创建本身的技术体系和技术认知!

相关文章
相关标签/搜索