Search code examples
javaeclipsedebuggingconditional-statementswatchpoint

Conditional breakpoint by caller in Java eclipse


I am trying to track a change of a value using watchpoint in a Java program in Eclipse debugger. The class hierarchy is pretty complex and the value I am tracking is wrapped in container, which is used on many places.

To be more specific, there is a container SizeRequirement, which has a property minimum, which I am tracking. This class is used by many layout managers on many places for many components to define requirement for component's sizes. I need to catch exact call, where the value changes/is set for one specific layout manager and one specific component in it. Is it possible to filter breakpoints by caller? I will try to explain the problem using some abstract code:

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";
  }

}

I set a watchpoint on value and I only want breakpoint to suspend only when the value is set by class A and ignore calls by B.

To make things worse, class SizeRequirement is part of swing library and is deeply integrated in code, so I cannot use inheritance to replace it by some child on some exact place where I want to track it.

EDIT

So this is what I used as conditional breakpoint condition. Believe or not, it works. :)

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

Solution

  • It's pretty disgusting and probably slow, but you can use

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

    as your breakpoint condition.

    Based on this bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=72961 I don't think Eclipse will support it directly