在程序开发过程中,Bug可以说难以避免。如果定位Bug、分析Bug可以说是快速解决问题的关键。
而定位Bug最重要的手段就是调试了。
Eclipse提供非常强大的调试工具。包括以前的自己都只是使用了简单的断点工具,其实Eclipse的调试手段远非如此。
Debug视图
Debug视图,提供当前执行的线程、表达式、变量值等等信息。
条件断点
再调试的时候,经常出现在循环中,某一个循环出了问题,而我们希望程序能再出问题的这次循环挂起。应当初核操作呢?
Eclipse提供条件断点,即某个条件之下才执行的断点。
如果在使用条件断点,先设置断点,然后在短点上右键>Breakpoint Properties
即可打开条件断点,设置窗口:
如果需要设置条件,勾选
Enable Condition
然后输入表达式即可,这里的表达式,即为你Java代码里需要进行条件判断的表达式。如:
for (int i = 0; i< 100; i++) {
/**
* 逻辑代码
*/
System.out.println("i:" + i);
}
如果我们想在i=50
的时候进行调试,则条件断点的表达式为i == 50
查看和修改变量值
在Variables视图,可以查看某个标量的值。
而在另一些情况下,如果想简单修改某个变量的值,看看程序的输出情况,也可以在这里直接修改。
展示逻辑结构
如果你需要在变量视图查看一个Map对象或者List对象的值,对于eclipse的默认设置,一般并不是那么容易。假设,你使用的是HashMap,你需要点击遍历各个实体条目,并面临各种HashMap的实现细节。但是,在变量视图上面有一个叫做“Show Logical Structure”的按钮。它非常有用,尤其当你的对象的toString()方法所展示的信息并不友好的时候。我的老大在几周前为我展示了这个功能。
导航 Drop to Frame
我想任何人都知道“Step Into”, “Step over”,而且可能也知道“Step return”. 这些是调试时的基本导航功能。我想提两个我非常喜欢的导航的高级方法。第一个是“Drop to Frame”. 使用这个特性你可以及时回退 ;-) 你可以直接回退到运行过的java堆栈帧中某一帧。当我调试时,一不小心错过了某个关注的代码行时,我常常用这个回退一帧。使用“Drop to Frame”这个特性我可以简单的重新运行某帧代码。
断点视图:Watchpoints
如果改变这个变量会有什么结果?! 有时候创建一个watchpoint对于调试会非常有用。调试器会停止,不管这个被观察的字段是被修改还是被读取 - 你可以自己来配置决定。你只需双击一个字段,然后你就可以在断点视图中看到watchpoint,并且可以编辑它的属性。你甚至可以一个访问次数,这意味着当变量被访问的次数达到这个数量的时候,调试器会停止。这对于普通的断点也适用。
总结一下,即当我们想在某个变量在所有改变的时候、读取的时候,进入调试流程,我们不可能在所有使用到这个变量的地方全部打上断点,这个时候,就会用到Watchpoints.
这里需要说明一下,Watchpoint添加的时候,需要在Outline视图中选中某一个变量,然后在工具栏的Run>Toggle Watchpoints进行添加。
友好的可读的对象
变量视图是使用对象的toString方法来现实对应的值。因为这个原因,如果提供友好的toString方法实现,对调试来说会非常有用。在javadoc中关于java.lang.Object的默认toString实现,也是这样推荐的:
返回一个表示该对象的字符串。通常<code>toString</code>方法返回这么一个字符串,“字面表示”该对象。返回结果必须是一个简洁却富含可表示该对象的信息,并且友好可读取。我们推荐所有的子类都覆盖这个方法。
你可以参考commons-lang中的 ToStringBuilder。它提供一些功能来编写 (引用自javadoc ) "良好并连贯” 的toString方法。
以上这几段,来自开源中国,因为发现总结的很全。
此段来源: http://www.oschina.net/translate/again-10-tips-on-java-debugging-with-eclipse
Debug相关的快捷键
F5 – “单步进入”
F6 – “单步执行并跳过”
F7 – “单步执行并返回”
F8 – “继续执行”
Ctrl+Shift+B – “添加断点”
Ctrl+Shift+I – “检查”