在两个调试会话之间保留对象ID

问题描述:

我正在使用eclipse调试器调试java应用程序。在两个调试会话之间保留对象ID

我想知道的对象ID调试器显示给我(见Java object ID in jvm)。

是否可以在两个调试会话中使这些ID相同?所以,当我调试相同的应用程序两次(一个接一个)相同的对象具有相同的ID?或者是否有可能像这样设置断点:在涉及给定id的对象时,在任何语句中断开?

我记住了一个不涉及某一行代码的断点定义。我想到了一个独立于代码行的断点。仅涉及id的断点。调试器有一个类似于这些ID的工具:他不能用它来为我提供像我建议的功能吗?

这是不可能的。该ID在调试器内部,每创建一个对象(或从序列化中恢​​复等)时都会随机生成。此外,你不应该试图以这种方式滥用财产。

幸运的是,Java有一些东西,可能会满足您的需求:Object#hashCode。它是每个唯一对象的(半)唯一标识符(就Object#equals而言)。因此,只要数据相同,就可以在调试会话中一致地识别对象。

Eclipse可以基于所有类的成员变量为您hashCode()。我建议使用它,因为它可能会适合您的需求,并保证散列具有所有期望的属性。它是在右键单击 - >源代码 - >生成hashCode()和等于()

就断点而言,只需创建一个if检查正确的对象并放置一个断点。

+1

只要确保的hashCode是不是基于存储器地址的一个默认将从运行改为运行 – Attila 2012-03-22 10:49:29

+1

@Attila这就是为什么我建议让Eclipse中生成一个 – dtech 2012-03-22 10:52:13

我不知道具体是什么标识调试(除了他们唯一标识在调试会话对象)期间在Eclipse代表 - 可能是内存地址,手柄(内部或外部),等。由于对象通常是动态创建的调试器无法知道一个对象在另一个(过去)调试会话中与另一个对象相同。

我能想象这种情况发生的唯一方法是如果ID是基于创造的秩序,以相同的顺序将创建完全相同的对象分配 - 而不是一个可能的事件。

所以答案是否定的。

+0

将作为注释 – dtech 2012-03-22 10:52:54

+0

@Attila更好。为什么它不是一个可能的事件?在我们处理一个“确定性”机器之后,相同的输入应该导致相同的结果? – Matthias 2012-03-23 09:42:13

+1

确定性意味着seme输入在相同的配置下导致相同的输出,但配置可能会改变(例如时间不同,操作系统可能会分配不同的内存块,线程运行在不同的交织等等)。 ) – Attila 2012-03-23 14:09:23