开发程序少不了出错、调试,Eclipse应该是最常用的Java ide了,那么Eclipse有哪些技巧可以提高我们调试的效率呢?本文翻译自《Top 10 Java Debugging Tips with Eclipse》。相信我,这里的调试技巧会让你有更多的时间做其他事(约会^-^)。
这篇博客会加入一些个人的理解,可以点击这里查看原文。限于本人英文水平,翻译可能不太准确,请大家见谅。
在这个教程中,我们会看到使用Eclipse调试Java应用程序的技巧。调试器帮助我们发现并修改程序的错误。这里我们会集中精力在运行时错误上,而不会提及编译时错误。在这个教程中,我们将专注于我们最喜欢的IDE:Eclipse的GUI调试器,而不会提及命令行调试器。虽然我们说的是Eclipse,但调试的技巧是通用的,这些技巧适用于大多数的IDEs,像NetBeans等等。
在开始看这篇教程之前,推荐你看看这篇Eclipse快捷键(英文),这对你会很有帮助.我的Eclipse的版本是Luna(原文的是Juno).
- 不要使用System.out.println作为调试的工具.
- 对所有涉及到的组件启用详细的日志级别.
- 使用日志分析器读取日志.
1.条件断点
大家应该都知道如何添加一个断点:在行号及其左边双击。在debug perspective(debug透视图)中,Breakpoints视图将列出所有的断点.我们可以为断点添加一个条件表达式.也就是说,这个断点只有在这个表达式为ture时才会激活并暂停程序执行,否则断点会暂时失效.
我们看一个例子:
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
运行这段程序会发现,总是在输出21%a[8] = 3
之后出现错误,如果直接在第4行添加一个断点,那么我们需要狂按鼠标9次才能发现,原来是因为a[9]=0.如果我们设置为i==9
,那么断点只有在i
为9时才会起作用,也就是暂停程序.会省很多麻烦:
下图为设置满足条件时中断(这里为i==9
).注意Breakpoint左边的星号,这表示没有保存,也就是做的改动不会生效,可以Ctrl+S保存,或者等它自动保存
或者可以这样:设置经过该断点第10次时生效,之后会将该断点设为无效
掌握这些技巧后,再也不会遇到狂点一阵鼠标之后不小心点过了,只能重新开始调试的尴尬了^-^.
2.异常断点
在Breakpoints视图中有一个按钮很像J!
,我们可以使用这个按钮添加基于java异常的断点.例如,我们希望这个程序在遇到NullPointerException
时暂停并且接受调试,那么我们可以使用这个按钮添加一个断点:
注:Luna版本的Eclipse貌似已经支持自动在运行时异常处中断了.上面那个例子,即使不加任何断点也会在遇到i==9
时暂停执行.不过检查异常还需要手动添加断点.
3.观察点
这是一个我非常喜欢的特性.当选定的变量被访问或者修改时暂停程序执行,并接受调试.添加观察点的方法是选择大纲视图,在添加观察点的成员变量上单击右键,选择Toggle Watchpoint
(切换观察点).这会为这个属性创建一个观察点,并且这个观察点会被列在断点视图中.这在你觉得属性被无缘无故的修改,又找不到在哪修改时尤其有用.
目前只有类的属性可以添加观察点,普通方法中的变量还不能添加观察点.其实也没有必要.
4.计算并显示
调试时在一个选择的变量或者表达式上按Ctrl+Shift+D或者Ctrl+Shift+I会显示该变量或者表达式的值.我们还可以在一个表达式/变量上添加一个永久的监视,这会将变量/表达式显示到表达式视图中:在变量上单击右键–>查看.
注: 对于变量,直接将鼠标放上去,停留一会就会出现变量的值.
5.改变变量的值
调试时我们可以改变变量的值.在变量视图中选择某个变量的值,输入新的值,回车,完成修改!可以把一个不符合我们预期的变量改为我们预期的值,继续运行.
6.在main方法处暂停
在Run/Debug设置中,我们可以选择”Stop in main”复选框,如果我们启用了这个特性,那么在调试时,程序会在main方法的第一行处暂停.然后可以在需要暂停的行单击右键,选择”Run to Line”(Ctrl+R 运行到该行),相当于创建了一个临时断点,省去了删除断点的麻烦.
7.环境变量
我们可以方便地通过编辑配置对话框添加环境变量,而不是通过我的电脑->属性…这有一个好处,不会影响电脑整体的环境变量,只有你配置的java应用程序受影响.所以,如果有什么环境变量是只有这一个程序需要的,那么在这里修改吧,不会把你的系统变量改得乱七八糟.
8.Drop to Frame
这个第二个我非常喜欢的特性.Drop to frame就是说,可以重新跳到调用堆栈中的方法的开始处重新执行(注:除了第一个方法,也就是main方法),并且所有上下文变量的值也回到那个时候。可以快速恢复到某一状态,而不需要重新开始调试。当然,原来执行过程中产生的副作用是不可逆的,比如你往数据库中插入了一条记录。
选中需要返回到的方法名,单击调试工具栏上的Drop to Frame
按钮,或者直接单击右键–>Drop to Frame
9.Step过滤
当我们使用单步进入(F5)
功能时,我们可能会不小心进入到一个我们并不想进入的库中,比如java类库中.我们可以在Preferences中添加过滤器,排除指定的包.这样以后我们使用单步进入
时就不会进入这些包中的类了.
10.进入,跳过和返回
这些技巧是debug最基本也是最重要的知识
- F5-单步进入,移动到下一步,如果当前行是一个方法调用,则进入这个方法的第一行
- F6-单步跳过,移动到下一步,如果当前行有方法调用,这些方法将直接执行完毕,并返回,然后到下一步
- F7-跳出函数,继续执行,直到当前方法执行完毕或者遇到断点时停止
- F8-执行到下一个断点处.
翻译于2015/04/09