Остановить на точке останова, когда класс присутствует в stacktrace

Есть ли способ в 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()

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
93
2

Ответы 2

Я думаю, что вы ищете вот что:

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()

Это не совсем то, что я хочу. Он останавливается на точке останова после достижения выбранной точки останова, но он отключается до тех пор, пока выбранная точка останова не будет достигнута снова (что и ожидалось), но я бы хотел останавливаться каждый раз, когда эта точка останова была передана в стек. Я отредактировал свой вопрос, чтобы добавить пример.

literg 20.11.2018 11:55

Да, и он работает по назначению, он отключен до тех пор, пока точка останова не будет достигнута снова, но меня интересует, чтобы точка останова оставалась активной для текущего стека. Представим, что этот Utils.doSomething() запускается в каком-то цикле, тогда он остановится только на первой итерации.

literg 20.11.2018 12:06

Я придумал добавить такое условие, оно не идеально, но работает

Arrays.asList((Thread.currentThread().getStackTrace())).stream()
    .anyMatch(ste -> ste.declaringClass.equals("debugging.SomeClass"))

Другие вопросы по теме