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

Java 在两个调试会话之间保留对象ID,java,eclipse,debugging,Java,Eclipse,Debugging,我正在使用eclipse调试器调试java应用程序 我想知道调试器向我显示的对象ID(另请参见) 是否可以在两个调试会话之间使这些ID相同?所以,当我调试同一个应用程序两次(一个接一个)时,相同的对象具有相同的id?或者可以像这样设置断点:当涉及具有给定id的对象时,在任何语句处中断 我有一个断点的定义,它不涉及特定的代码行。我想到了一个独立于代码行的断点。一个只涉及id的断点。调试器手头有一个像这些id这样的工具:他不能用它来提供我建议的功能吗?这是不可能的。该id是调试器内部的,并且在每次创

我正在使用eclipse调试器调试java应用程序

我想知道调试器向我显示的对象ID(另请参见)

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


我有一个断点的定义,它不涉及特定的代码行。我想到了一个独立于代码行的断点。一个只涉及id的断点。调试器手头有一个像这些id这样的工具:他不能用它来提供我建议的功能吗?

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

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

Eclipse可以基于所有类成员变量为您生成一个
hashCode()
。我建议使用它,因为它可能会满足您的需要,并保证哈希具有所有所需的属性。它位于右键单击->源->生成hashCode()和equals()下


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

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

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

Eclipse可以基于所有类成员变量为您生成一个
hashCode()
。我建议使用它,因为它可能会满足您的需要,并保证哈希具有所有所需的属性。它位于右键单击->源->生成hashCode()和equals()下


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

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

我能想象这种情况发生的唯一方式是,如果ID是根据创建顺序分配的,并且完全相同的对象是按照完全相同的顺序创建的——这不太可能是一个事件


所以答案是否定的。

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

我能想象这种情况发生的唯一方式是,如果ID是根据创建顺序分配的,并且完全相同的对象是按照完全相同的顺序创建的——这不太可能是一个事件


因此答案是否定的。

只要确保hashCode不是基于内存地址的默认hashCode,它将从run更改为runrun@Attila这就是为什么我建议让Eclipse生成一个hashCode,只要确保hashCode不是基于内存地址的默认hashCode,该内存地址将从run更改为runrun@Attila这就是为什么我建议让Eclipse生成one@Attila. 为什么这不是一个可能的事件?毕竟,我们正在处理一台“确定性”机器,在这种机器上,相同的输入应该导致相同的结果?确定性是指在相同配置下,seme输入导致相同的输出,但配置可能会改变(例如,时间不同,操作系统可能分配不同的内存块,线程以不同的交织方式运行,等等。)@Attila。为什么这不是一个可能的事件?毕竟我们正在处理一个“确定性”事件机器,其中相同的输入应导致相同的结果?确定性是指在相同的配置下,seme输入导致相同的输出,但配置可能会改变(例如,时间不同,操作系统可能分配不同的内存块,线程以不同的交织方式运行等)