Есть ли способ в Intellij создать условную точку останова, когда в трассировке стека присутствует определенный класс? В качестве альтернативы, когда в этой трассировке стека была передана конкретная точка останова.
Приведен пример:
Представим, что у нас есть некий служебный метод Utils.doSomething(), и я хочу остановиться на нем только тогда, когда этот метод был запущен из SomeClass.doSomething().
Я знаю, что есть «Отключить, пока не будет достигнута точка останова», но это останавливает выполнение кода в любое время, когда он выполняется после выполнения начального условия.
Пример:
class SomeClass {
void doSomething() {
int y = 1; // Breakpoint here
Utils.doSomething();
Utils.doSomething();
}
void doSomethingElse() {
Utils.doSomething();
}
}
static class Utils {
static void doSomething() {
int x = 1; // Breakpoint with condition here
}
}
@Test
public void test() {
SomeClass someInstance = new SomeClass();
someInstance.doSomething();
someInstance.doSomethingElse();
someInstance.doSomething();
}
Точка останова на int y = 1;
Точка останова с условием на int x = 1;
Он останавливается в Utils.doSomething(), когда выполняется первым из SomeClass.doSomething(), но не останавливается, когда Utils.doSomething() выполняется снова на следующей строке.
Правильно не останавливается при выполнении через SomeClass.doSomethingElse()




Я думаю, что вы ищете вот что:
https://www.jetbrains.com/help/idea/configuring-breakpoints.html
To set a breakpoint the current one depends on, select it from the Disabled until selected breakpoint hit drop-down list. Once dependency has been set, the current breakpoint is disabled until selected one is hit.
Choose Disable again radio button to disable the current breakpoint after selected breakpoint was hit.
Choose Leave enable radio button to keep the current breakpoint enabled after selected breakpoint was hit.
Таким образом, похоже, вам нужно будет установить его в строке SomeClass.doSomething(), а затем везде, где вам нужно, в методе Utils.doSomething()
Да, и он работает по назначению, он отключен до тех пор, пока точка останова не будет достигнута снова, но меня интересует, чтобы точка останова оставалась активной для текущего стека. Представим, что этот Utils.doSomething() запускается в каком-то цикле, тогда он остановится только на первой итерации.
Я придумал добавить такое условие, оно не идеально, но работает
Arrays.asList((Thread.currentThread().getStackTrace())).stream()
.anyMatch(ste -> ste.declaringClass.equals("debugging.SomeClass"))
Это не совсем то, что я хочу. Он останавливается на точке останова после достижения выбранной точки останова, но он отключается до тех пор, пока выбранная точка останова не будет достигнута снова (что и ожидалось), но я бы хотел останавливаться каждый раз, когда эта точка останова была передана в стек. Я отредактировал свой вопрос, чтобы добавить пример.