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

简介: 程序员的工作内容,除了大部分时间写代码之外,因为有不少的时间是用在调试代码上。甚至说不是在调试代码,就是即将调试代码。今天我们来谈谈调试代码的一些技巧,在使用IDE提供的debugger时一些快速定位问题的方式。

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

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

1 多线程调试

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

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

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

image

一个线程断下来之后,可以通过在线程窗口切换,到其它线程中继续运行。
IntelliJ IDEA里在这儿切换

image

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

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

PS: 这里顺道说一下,这就是为什么创建线程时建议起一个有意义的名字,至少是可以识别的名字,否则在这里都不能区分出哪个是自己的线程,想切换还麻烦。

2 后退执行

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

依靠后退执行的功能,可以后退,就像下棋时悔棋那种功能一样。当然,这个后退招待的名字是我自己起的,在IDE里被称为Drop Frame。

image

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

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

3 条件断点

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

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

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

image

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

4 片断代码

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

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

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

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

image

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

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

image

5 查看变量修改值

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

image

原文发布时间为:2018-07-10
本文作者:侯树成
本文来自云栖社区合作伙伴“程序员小灰”,了解相关信息可以关注“程序员小灰

相关文章
|
程序员 开发工具 git
做了程序员才知道的事情
每个行业都有属于自己的刻板印象,而程序员也不例外。在大众眼中,程序员常被描绘为背着双肩包、穿着格子衫、不爱交际、冷静的人设。各种关于程序员的段子层出不穷,然而真实的程序员到底是什么样子呢?作为一个程序员,我们经历了许多独特的经历和发现,只有亲身体验过才能真正理解,那么本文就来分享一下只有做了程序员才知道的事情,并探讨一下大众对程序员印象的误解。
143 0
做了程序员才知道的事情
|
运维 算法 程序员
不会写文档的程序员不是好的程序员
在IT行业中,文档是一种非常重要的沟通工具。它可以帮助程序员和客户及团队成员之间进行有效的沟通和协作,提高工作效率和项目成功率。然而,许多程序员往往忽视了文档的重要性,认为只要代码写得很好就可以了。但实际上,一个优秀的程序员不仅需要精通编码,还需要具备良好的文档编写能力。
196 2
|
程序员 Go 定位技术
程序员如何走向世界!
程序员如何走向世界!
65 0
|
前端开发 JavaScript 关系型数据库
程序员1
程序员1
160 0
|
小程序 算法 Unix
优秀的程序员,必须知道的
昨天看到一则新闻,一对夫妻起诉一家婚庆公司,缘由是这家婚庆公司盗用了他们的婚庆典礼创意,最终取得了胜诉 这不禁让我想到,作为程序员,代码就是我们的产品,应该如何保护自己的权益, 另外版权对我们来说已经是绕不开的话题了,特别是游戏 APP 的开发者,必须具有软件著作权才能发布 那么今天我们就聊一聊关于版权的那些事儿吧
198 0
优秀的程序员,必须知道的
|
程序员 C++
别人的1024程序员节VS你的1024程序员节
别人的1024程序员节VS你的1024程序员节
379 0
|
程序员
为什么要选择做一名程序员?
从这篇文章开始准备做一个大学生学编程系列文章,主要帮助一些还在编程路上徘徊的小伙伴,作为一个过来人的身份总结一些编程经验以及心得,在自学的过程中走了很多的弯路,在此通过这个专栏分享给需要编程的小伙伴。
2117 1
|
程序员 Ruby Java
不要再叫自己“程序员”了
程序员不要将自己限定在写代码这一单一职能上,需要认清自身商业价值的本质,需要锻炼自己的沟通能力,擅于表现自己。职业只是一种生活方式,并不能完全支配我们的幸福。我们应该为了生活而工作,而不要为了工作而生活。
2587 0
|
架构师 Java 程序员
成为优秀的程序员需要知道的8件事
1. 自我完善 尽量发布可以运行的代码。不要指望 QA 能给你找出所有的程序错误。要经常并且全面深入地测试你的代码,不断找出可以完善的方法。 2. 公平竞争 尝试其他技术、框架、方法和观点。
1054 0