你应该看过一些如《关于调试的N件事》这类很流行的帖子 假设我每天花费小时在调试我的应用程序上的话那累积起来的话也是很大量的时间由于这个原因用这些时间来重视并了解所有使我们调试更方便的功能那能为你省下一些时间也将会使你的生活更安逸轻松同时也表明其它关于此主题的帖子也是很有价值的
不要调试太多
一个关于调试的疯狂声明作为开头但它必须是要说的!尝试切分一下你那复杂的逻辑成多个独立的单元并编写单元测试来检测你代码的正确性我想像如下这样的流程应该是发生得非常频繁的一些人通过大型web应用程序点击填写多个表单切换到不同的页面正在最后的页面上检测工个计算逻辑和实现这个调试视图中的大部分逻辑在启动你的tomcat之前总是问你自己有没有方法使用一个单元测试来检测这些行为?你在过去这些时间可以不知道或已忘记这些但从现在开始我们将要关注一些eclipse的调试技巧你会发现有大量的关于良好代码设计的好东西
断点视图 条件断点
如果你只对应用中的某部分感兴趣的话这个功能非常有用例如如果你要在第次循环的时候检查程序或者在一个抽象父类中调试某些功能而你只关注其中一个具体的实现你可以在断点视图中设置条件或者通过代码旁边的蓝色断点标记的右键菜单(Breakpoint Properties)设置你可以在条件代码片段为true的时候暂停程序或者当代码片段的值改变的时候挂起程序
变量视图展示逻辑结构
如果你需要在变量视图查看一个Map对象或者List对象的值对于eclipse的默认设置一般并不是那么容易假设你使用的是HashMap你需要点击遍历各个实体条目并面临各种HashMap的实现细节但是在变量视图上面有一个叫做Show Logical Structure的按钮它非常有用尤其当你的对象的toString()方法所展示的信息并不友好的时候我的老大在几周前为我展示了这个功能你知道他经常跟PowerPoint或者Excel打交道对于我这么一个开发人员多丢脸哦
未开启Show Logical Structure
开启Show Logical Structure
变量视图更改变量值
当你需要稍微更改输入信息的时候不需要重新开始调试会话只需在一个表格中输入新的信息你可以在调试阶段直接修改你的变量的值有写时候你可以节省一些时间你可以通过这个功能更加简单的模拟一些怪异的情况
Display视图
你知道Display视图吗?你可以在调试过程中通过Window > Show View > Display来激活它现在你的eclipse应该是一个空白的新视图你可以使用这个视图输入或者演算一些新的代码这些代码在当前的调试位置的上下文环境中被执行这意味着你可以使用所有变量甚至是内容助手要执行你的代码的话只需标记它并使用右键菜单或者CTRL+U(执行)或者 CTRL+SHIFT+I (检查)
导航Drop to Frame
我想任何人都知道Step Into Step over而且可能也知道Step return 这些是调试时的基本导航功能我想提两个我非常喜欢的导航的高级方法第一个是Drop to Frame 使用这个特性你可以及时回退 你可以直接回退到运行过的java堆栈帧中某一帧当我调试时一不小心错过了某个关注的代码行时我常常用这个回退一帧使用Drop to Frame这个特性我可以简单的重新运行某帧代码
导航Step into Selection
第二个是Step into Selection 这也是很简单但很多人使用的一个要使用它你只需要按 Ctrl+Alt 同时点击一个你想运行到的方法名非常方便非常快速相比Step Into这个非常方便想想你像跟蹤进一个有很多参数的函数如果用Step Into你必须进入退出每个参数计算过程才能进入到你真正想进的函数Run to line也是很棒的特性只需要把光标放在你想运行到的哪一行前面然后按CTRL+R就可以了
导航器使用键盘
如果避免使用鼠标的话你的操作速度会更快你至少应该如下的快捷键
F – 单步进入
F – 单步执行并跳过
F – 单步执行并返回
F – 继续执行
Ctrl+Shift+B – 添加断点
Ctrl+Shift+I – 检查
断点视图Watchpoints
如果改变这个变量会有什么结果?! 有时候创建一个watchpoint对于调试会非常有用调试器会停止不管这个被观察的字段是被修改还是被读取 你可以自己来配置决定你只需双击一个字段然后你就可以在断点视图中看到watchpoint并且可以编辑它的属性你甚至可以一个访问次数这意味着当变量被访问的次数达到这个数量的时候调试器会停止这对于普通的断点也适用
友好的可读的对象
变量视图是使用对象的toString方法来现实对应的值因为这个原因如果提供友好的toString方法实现对调试来说会非常有用在javadoc中关于javalangObject的默认toString实现也是这样推荐的
返回一个表示该对象的字符串通常<code>toString</code>方法返回这么一个字符串字面表示该对象返回结果必须是一个简洁却富含可表示该对象的信息并且友好可读取我们推荐所有的子类都覆盖这个方法
你可以参考commonslang中的 ToStringBuilder它提供一些功能来编写 (引用自javadoc ) 良好并连贯 的toString方法
默认的ToString
默认的ToStringBuilder例子
ToStringBuilder例子 – 多行文本风格
如果你不能修改toString实现例如你现在使用框架或者一个外部的API你可以有另外一个选择在Eclipse中创建一个Detail Formatter你需要在变量视图中右击一个对象并点击New Detail Formatter…然后你就可以输入一些代码用于展现这个对象