10

我正在尝试使用 Eclipse 调试器中 Java 程序中的观察点来跟踪值的变化。类层次结构非常复杂,我正在跟踪的值被包装在容器中,该容器在许多地方都使用过。

更具体地说,有一个 container SizeRequirement,它有一个 property minimum,我正在跟踪它。许多布局管理器在许多地方为许多组件使用此类来定义对组件大小的要求。我需要捕捉确切的调用,其中值更改/设置为一个特定的布局管理器和其中的一个特定组件。是否可以按调用者过滤断点?我将尝试使用一些抽象代码来解释这个问题:

class ValueContainer {
  public String value;
}

class A {

  private ValueContainer valueContainer;

  public A () {
    valueContainer = new ValueContainer();
    valueContainer.value = "setByA";
  }

}

class B {

  private ValueContainer valueContainer;

  public B () {
    valueContainer = new ValueContainer();
    valueContainer.value = "setByB";
  }

}

我设置了一个观察点value,我只希望断点仅在valueA 类设置并忽略 B 调用时暂停。

更糟糕的是,类SizeRequirement是 Swing 库的一部分,并且深度集成在代码中,所以我不能使用继承在我想要跟踪它的某个确切位置用某个子代替换它。

编辑

所以这就是我用作条件断点的条件。信不信由你,它有效。:)

    StackTraceElement[] arr = Thread.currentThread().getStackTrace();
    boolean contains = false;
    for(StackTraceElement e : arr) {
        if (e.getClassName().contains("A")) {
            contains = true;
            break;
        }
    }
4

2 回答 2

6

这很恶心,可能很慢,但你可以使用

Thread.currentThread().getStackTrace()[2].getClassName().contains("A")

作为你的断点条件。

基于这个错误https://bugs.eclipse.org/bugs/show_bug.cgi?id=72961我不认为 Eclipse 会直接支持它

于 2013-01-17T15:02:19.553 回答
0

Eclipse 可以做到这一点。创建一个断点,然后进入 Debug 透视图并进入“Breakpoints”视图。选择断点并

在那里你可以说启用“条件”并选择“值更改时暂停”

然后,您必须在下面的字段中输入您的值,在您的情况下可能是“最小值”。

编辑:

我刚刚尝试过,但没有按预期工作,但我找到了另一种可能有效的解决方案:

java/eclipse中的数据断点

总结:在定义字段的行中创建一个断点,它将成为一个观察点。在“断点属性”中,您可以将其指定为仅在更改时暂停(边缘上的符号将是一支笔),而不是在访问时(符号将是一副眼镜)。

于 2013-01-17T14:53:28.250 回答