Java eclipse中调用者的条件断点

Posted

技术标签:

【中文标题】Java eclipse中调用者的条件断点【英文标题】:Conditional breakpoint by caller in Java eclipse 【发布时间】:2013-01-01 03:09:42 【问题描述】:

我正在尝试在 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";
  


我在 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;
        
    

【问题讨论】:

【参考方案1】:

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

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

作为你的断点条件。

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

【讨论】:

这不会暂停虚拟机,但会在执行该段代码时打印堆栈跟踪。 当然,如果调用者类的名称包含“A”,这将返回真/假值。我需要更一般的陈述——我的班级可以在堆栈上的任何地方,而不仅仅是作为直接调用者。然后您可以将其用作条件断点的语句,然后VM将暂停。不幸的是观察点不能是有条件的,但我仍然能够跟踪代码中的所有位置,其中值使用观察点发生变化,我可以在那里放置条件断点。所以这个建议非常有用。我会做更多的实验。谢谢! @Radium 它应该很容易遍历整个堆栈跟踪以查找类,当然您不需要使用contains - 如果您有完整的,请使用equals类的名称。 (让自己成为一个静态方法,如果你不能将代码放入单行中,则调用它)【参考方案2】:

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

您可以在此处启用“条件”并选择“值更改时暂停”

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

编辑:

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

data breakpoints in java/eclipse

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

【讨论】:

对于您的第一篇文章,这有点误解。该值未设置为“最小值”,但其本身被命名为“最小值”,如public int minimum = 0。而且我需要暂停,当该值是由其他一些确切类的对象设置时。对于您的编辑,是的,我正在尝试按照您的建议使用观察点。问题是,许多对象经常更改该值,即使我不想,程序也会暂停。无论如何,感谢您的宝贵时间! 我确实知道minimum 是该字段的名称,但不知何故让我注意到您只想捕获某个类的更改。我认为这只是关于“改变”与“访问”。所以是的,我认为 artbristol 给出了正确的答案。

以上是关于Java eclipse中调用者的条件断点的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Eclipse 中使用条件断点?

当某个条件为真时,如何在 Eclipse 中以编程方式设置 C++ 断点?

eclipse 断点调试

可以用命令行控制eclipse断点增加删除远程调试创建与启动的插件

调试Java代码(Eclipse)汇总

OD调试器断点——条件断点