专栏名称: 码农翻身
工作15年的前IBM架构师分享好玩有趣的编程知识和职场的经验教训, 不容错过。
目录
相关文章推荐
程序员小灰  ·  这几个难到令人发指的编程语言,学会了算我输 ·  2 天前  
码农翻身  ·  第一批鸿蒙激励金到账,选鸿蒙选对了! ·  3 天前  
程序员的那些事  ·  趣图:当女程序员晒新染的发色后 ·  4 天前  
程序猿  ·  Linux 版微信正式官宣,居然选了这个 ... ·  5 天前  
程序员的那些事  ·  这个大学生写了个免费软件,全世界网民抢着给他 ... ·  1 周前  
51好读  ›  专栏  ›  码农翻身

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

码农翻身  · 公众号  · 程序员  · 2017-03-01 20:08

正文

来源: Tomcat那些事儿(微信号:tomcat0000)

作者: 侯树成


程序员的工作内容,除了大部分时间写代码之外,因为有不少的时间是用在调试代码上。甚至说不是在调试代码,就是即将调试代码。 :)


今天我们来谈谈调试代码的一些技巧,在使用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 Frame退回到上一个函数, List中仍然包含添加的数据, 而不会恢复到之前的状态。 


但是在该方法再次被调用时,你可以观察List什么时候被改变的,至少不需要再重跑一遍程序了,甚至你可以一言不合就后退。


3 条件断点


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


其实,在添加断点的时候,我们可以为断点增加一定的条件,这样,在指定的条件满足时,断点才会生效。


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


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



4 片断代码


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


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


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


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



这就就相当于临时改变了变量内容。


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



5 查看变量修改值


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




如果觉得本文标题党,欢迎分享你在调试过程中认为不错的技巧,欢迎留言分享。:)


你看到的只是冰山一角, 更多精彩文章,参见《码农翻身2016文章精华


有心得想和大家分享? 欢迎投稿 ! 我的联系方式:微信:liuxinlehan  QQ: 3340792577


公众号:码农翻身

“码农翻身”公众号由工作15年的前IBM架构师创建,分享编程和职场的经验教训。



编辑推荐


掘金是一个高质量的技术社区,从移动开发到架构设计,编程语言到开源类库,让你不错过互联网开发的每一个技术干货。长按图片二维码识别或者各大应用市场搜索「掘金」,技术干货尽在掌握中。