IntelliJ Idea (debugging) conditional breakpoint d

2020-05-31 04:14发布

问题:

I want to set a debug breakpoint in IntelliJ Idea that is only active, if another previous breakpoint was activated. For example i have a breakpoint B1 on line 10, and another breakpoint B2 on line 20. Even if B2s condition is true, the debugger should only halt if B1s condition was true before B2s.

Is something like this possible in Idea?

Update:

Currently i'm working with this workaround:

  1. set the two breakpoints
  2. disable breakpoint #2
  3. start the debugger, wait until breakpoint #1 is active
  4. activate breakpoint #2

I hope there is a cleaner way to do this :)

回答1:

You can do that in the View Breakpoints... view:

In your case you will first have to set a conditional breakpoint on B1 so that when it is hit then and only then B2 will be triggered.



回答2:

An alternate programmatic approach to debug specific classes when some condition in some class is met.

/*
 * Breakpoint helper, stops based on a shared state
 *  STOP variable
 *
 * Everything in here should be chainable
 *  to allow adding to breakpoints
 */
public final class DEBUG {

/*
 * global state controlling if we should
 *   stop anywhere
 */
public static volatile boolean STOP = false;

public static volatile List<Object> REFS = new ArrayList<>();

/**
 * add object references when conditions meet
 * for debugging later
 */
public static boolean ADD_REF(Object obj) {
    return ADD_REF(obj, () -> true);
}

public static boolean ADD_REF(Object obj, Supplier<Boolean> condition) {
    if (condition.get()) {
        REFS.add(obj);
        return true;
    }
    return false;
}

/*
 * STOPs on meeting condition
 *  also RETURNS if we should STOP
 *
 * This should be set when a main condition is satisfied
 *      and can be done as part of a breakpoint as well
 */
public static boolean STOP(Supplier<Boolean> condition) {
    if (condition.get()) {
        STOP = true;
        return true;
    }
    return false;
}

public static boolean STOP() {
    return STOP(() -> true);
}

Where you want a condition to set the breakpoint

Where you want to stop based on a condition