在 java 中为特定对象(而不是该类型的所有实例)设置(方法)断点

set a (method) breakpoint for a particular object (and not all instances of that type) in java

假设我有一个 class

public class Foo
{
     public void doThing() { ...}
}

说我有很多 Foo 实例,但我只对其中一个特别感兴趣。

我如何 "tag" 该实例并在 doThings 中设置一个 "conditional breakpoint" 仅针对标记的实例停止? 有没有 "builtint" 方法,尤其是 Eclipse 调试器,可以做到这一点?

目前,我必须在 Foo class 中手动创建一个布尔标志,默认情况下将其设置为 false,并根据 doThings 中的那个创建条件断点。 然后当我遇到感兴趣的对象时,我会通过执行 Display window.

中的 setter 代码将标志设置为 true

但很明显,这需要修改代码并添加一些样板,这并不总是可行的,也不是一件好事。

我不知道有什么 "proper" 方法,但是一种方法是在第一次创建 watch window 时调用 hashCode(),然后设置断点也以 hashCode() 为条件。因此,您每次 运行 都需要更改断点 - 有点烦人,但它至少为您提供了一个常量值,您可以使用该值来引用该对象。 (假设 class 没有覆盖 hashCode(),当然 - 如果您有许多具有相同哈希码的实例,这会使事情变得更加棘手。)

这不是最干净的方法,但您可以在实例的默认 Object#toString 输出上设置条件断点。

得到实例的默认toString()结果后,在doThing方法中添加类似下面的断点条件:

this.toString().equals("Foo@184ec44")

是的,Eclipse中有实例断点。

您必须 在所需的 class 中放置一个公共断点,并且在变量面板中,您 right-click 在实例上并选择 实例断点.

弹出窗口将询问您要为该实例激活哪个断点。

你来选择,大功告成!