2009-10-09 46 views
1

我只是有一个想法,我想知道在java中是否可能。比方说,在使用eclipse或netbeans进行调试时,您可以记录一个对象并保存它。然后,当经过第二轮调试时,再次保存该对象。现在你可以比较第一个记录的对象和第二个对象的所有属性,并找出任何差异。这可能吗?很酷的调试对象

+1

Eclipse在调试时做了一些与此相关的工作 - 它将突出显示断点之间更改的值/引用 - 请参阅http://www.ibm.com/developerworks/java/library/os-ecbug/ – Nate 2009-10-09 10:28:26

回答

5

你可以用普通的Java代码(假设你的对象是Serializable)做到这一点,但我认为任何调试器都没有内置此功能。

这只是在调试运行期间序列化第一个对象的情况(如果您有静态方法这样做,您通常可以从调试器调用)并将其保存在某处。然后,在第二次运行期间,调用另一种方法从它的序列化表单重新构建对象 - 然后比较对象(或者与它们的equals()方法或一些更为定制的比较方法)。

实际上,尽管我发现每当我想要做到这一点,我只是在一张纸上涂抹相关属性并手动比较它们。我很少看到成千上万的可能在跑步之间发生变化的属性;如果你考虑到你所看到的症状和对象的行为,通常可以很好地理解甚至在启动调试器之前会发生什么变化,然后使用后者来确认你的假设并回溯到看到价值“出错”的地方。

+0

的图9我喜欢你做什么以及在纸上写下来。并寻找更专业的方式做到这一点 – cometta 2009-10-10 10:03:16

1

给你的对象一个有用的toString()方法,然后使用单元测试来比较结果和你的期望。

但我同意:用于远程调试的有线协议可以序列化任何对象,因此应该可以编写一个自动执行此操作的程序。

OTOH,不打算序列化的对象可能是危险的。如果你不小心在类加载器上使用它,你会得到所有的对象和类以及所有的东西。所以你需要一种方法来停止序列化,以确保它不会在深对象树中运行混乱。

最重要的是,我想要一个功能来保存应用程序的当前状态,并能够及时回溯。

1

我不认为任何调试器可以保存对象以便稍后进行比较。你虽然可以做的是建立在变量表变量,但与Apache公地ToStringBuilder()包裹它,并在控制台倾倒,像这样:

System.out.println(ToStringBuilder.reflectionToString(object)); 

每到达断点,时间对象的内容将显示在控制台中。你甚至可以看到私人数据。

因此,您不需要直接修改对象的toString()方法(例如,这对于库对象很有用)。然后您可以比较两次传球的输出。

+0

看起来很酷的技术给我。感谢指出这一点 – cometta 2009-10-10 10:04:52