Java eclipse中调用方的条件断点
我试图在Eclipse调试器中的Java程序中使用观察点跟踪值的更改。类层次结构非常复杂,我跟踪的值包装在容器中,容器在许多地方都使用 更具体地说,有一个容器Java eclipse中调用方的条件断点,java,eclipse,debugging,conditional-statements,watchpoint,Java,Eclipse,Debugging,Conditional Statements,Watchpoint,我试图在Eclipse调试器中的Java程序中使用观察点跟踪值的更改。类层次结构非常复杂,我跟踪的值包装在容器中,容器在许多地方都使用 更具体地说,有一个容器SizeRequirement,它有一个属性minimum,我正在跟踪它。此类由许多位置的许多布局管理器用于许多组件,以定义组件尺寸的要求。我需要捕捉准确的调用,其中值更改/设置为一个特定布局管理器和其中的一个特定组件。是否可以按调用方筛选断点?我将尝试使用一些抽象代码来解释这个问题: class ValueContainer { pu
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";
}
}
我在值
上设置了一个观察点,我只希望断点仅在值
由类a设置并且忽略B的调用时挂起
更糟糕的是,类SizeRequirement
是swing库的一部分,并且与代码深度集成,所以我不能使用继承来替换它,而让它由我想要跟踪它的某个确切位置上的某个子项来代替
编辑
这就是我使用的条件断点条件。信不信由你,它是有效的
Eclipse可以做到这一点。创建一个断点,然后进入Debug透视图和“Breakpoints”视图。选择断点并单击“确定” 在这里,您可以说启用“条件”并选择“值更改时挂起” 然后,您必须在下面的字段中输入您的值,在您的情况下可能是“最小值” 编辑: 我只是尝试了一下,但没有达到预期效果,但我找到了另一个可能有效的解决方案: 总之:
在定义字段的行中创建断点,它将成为观察点。在“断点属性”中,您可以将其指定为仅在更改时挂起(边距上的符号将是一支笔),而不是在访问时挂起(符号将是一副眼镜)。这很恶心,可能很慢,但您可以使用
Thread.currentThread().getStackTrace()[2].getClassName().contains("A")
作为断点条件
基于这个bug,我认为Eclipse不会直接支持它,它不会挂起VM,但会在执行该段代码时打印堆栈跟踪。当然,如果调用方类的名称包含“a”,它将返回真/假值。我需要更一般的语句——我的类可以位于堆栈上的任何位置,而不仅仅是作为直接调用方。然后您可以将其用作条件断点的语句,然后VM将挂起。不幸的是,监视点不能是有条件的,但我仍然能够跟踪代码中的所有位置,其中的值使用监视点进行更改,并且我可以在那里放置条件断点。所以这个建议很有用。我会做更多的实验。谢谢@镭在整个堆栈跟踪中循环查找类应该很容易,当然,如果您有类的全名,则不需要使用
contains
-使用equals
。(让自己成为一个静态方法,如果你不能将代码放入一行代码中,那么就调用它)在你的第一篇文章中,这是一个小小的误解。该值未设置为“最小值”,但其本身命名为“最小值”,如public int minimum=0
。我需要挂起,当这个值是由另一个确切类的对象设置的。对于您的编辑,是的,我正试图使用一个观察点,正如您所建议的。问题是,该值经常被许多对象更改,即使我不想更改,程序也会挂起。无论如何,谢谢你抽出时间!我知道minimum
是字段的名称,但不知何故,我没有注意到您只想捕获某个类的更改。我以为这只是关于“改变”和“访问”的问题。是的,我认为阿特布里斯托尔给出了正确的答案。
Thread.currentThread().getStackTrace()[2].getClassName().contains("A")