我试图在Eclipse调试器的Java程序中使用watchpoint跟踪值的更改。类层次结构非常复杂,我跟踪的值包含在容器中,容器在很多地方使用。
更具体地说,有一个容器SizeRequirement
,它有一个属性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
上设置了一个观察点,我只希望断点只有在A类设置value
并忽略B调用时暂停。
更糟糕的是,类SizeRequirement
是swing库的一部分,并且深深地集成在代码中,因此我无法使用继承来替换某些孩子在我想要跟踪它的某个确切位置。
修改
所以这就是我用作条件断点条件的东西。信不信由你,它的确有效。 :)
StackTraceElement[] arr = Thread.currentThread().getStackTrace();
boolean contains = false;
for(StackTraceElement e : arr) {
if (e.getClassName().contains("A")) {
contains = true;
break;
}
}
答案 0 :(得分:5)
这很恶心,可能很慢,但你可以使用
Thread.currentThread().getStackTrace()[2].getClassName().contains("A")
作为断点条件。
基于此错误https://bugs.eclipse.org/bugs/show_bug.cgi?id=72961我不认为Eclipse会直接支持它
答案 1 :(得分:0)
Eclipse可以做到这一点。创建一个断点,然后进入Debug透视图并进入“Breakpoints”视图。选择断点和
在那里你可以说启用“条件”并选择“值改变时暂停”
然后您必须在下面的字段中输入您的值,在您的情况下可能是“最小”。
修改强>
我刚刚尝试过这个并没有按预期工作,但我找到了另一个可行的解决方案:
data breakpoints in java/eclipse
总结: 在定义字段的行中创建断点,它将成为观察点。在“断点属性”中,您可以将其指定为仅在更改时暂停(边距上的符号将为笔),而不是访问时(符号将是一副眼镜)。