Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/94.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java eclipse中调用方的条件断点_Java_Eclipse_Debugging_Conditional Statements_Watchpoint - Fatal编程技术网

Java eclipse中调用方的条件断点

Java eclipse中调用方的条件断点,java,eclipse,debugging,conditional-statements,watchpoint,Java,Eclipse,Debugging,Conditional Statements,Watchpoint,我试图在Eclipse调试器中的Java程序中使用观察点跟踪值的更改。类层次结构非常复杂,我跟踪的值包装在容器中,容器在许多地方都使用 更具体地说,有一个容器SizeRequirement,它有一个属性minimum,我正在跟踪它。此类由许多位置的许多布局管理器用于许多组件,以定义组件尺寸的要求。我需要捕捉准确的调用,其中值更改/设置为一个特定布局管理器和其中的一个特定组件。是否可以按调用方筛选断点?我将尝试使用一些抽象代码来解释这个问题: class ValueContainer { pu

我试图在Eclipse调试器中的Java程序中使用观察点跟踪值的更改。类层次结构非常复杂,我跟踪的值包装在容器中,容器在许多地方都使用

更具体地说,有一个容器
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")