Условные точки останова в стеке вызовов с помощью Netbeans и Java

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

В Java текущий стек вызовов можно получить несколькими способами, например

Thread.currentThread().getStackTrace()

который возвращает массив элементов трассировки стека.

Можно ли выполнить итерацию по массиву (или преобразованному списку), проверить имена методов и вернуть логическое значение всего в одной строке?

Или, если мне нужно написать метод, который проверяет массив и возвращает логическое значение на основе существования интересующего метода, где я должен его поместить?


person coolcfan    schedule 05.03.2015    source источник
comment
Добавьте точку останова там, где вы хотите, щелкните правой кнопкой мыши узел точки останова (в желобе поля) и выберите Свойства точки останова... Заполните детали...   -  person MadProgrammer    schedule 05.03.2015
comment
@MadProgrammer дело не в том, где я должен поставить условие, а в том, что я должен написать в поле условия. Требуется выражение, которое возвращает логическое значение; поэтому я на самом деле спрашиваю, как мне проверить массив StackTraceElement на наличие нужного элемента в этом состоянии.   -  person coolcfan    schedule 05.03.2015
comment
@coolcfan Я добавляю доказательство концепции в свой ответ.   -  person Ortomala Lokni    schedule 19.03.2015


Ответы (2)


Вы можете добавить условия тестирования приватного метода в стек и вызвать его из условной точки останова. Вот доказательство концепции:

public class DebugStack {
    private int x = 0;
    private void m1(){
        x++;
        m2();
    }
    private void m2(){
        x+=3;         
    }
    private boolean insideMethod(String methodName){
        for (StackTraceElement stackTrace : Thread.currentThread().getStackTrace()) {
            if (stackTrace.getMethodName().equals(methodName)) {
                return true;
            }
        }
        return false;
    }
    public static void main(String[] args) {
        DebugStack dbg = new DebugStack();
        dbg.m1();
        dbg.m2();

    }
}

Если вы поместите условную точку останова внутри m2() с this.insideMethod("m1") в качестве условия, приложение будет останавливаться в точке останова только тогда, когда m2() вызывается из m1().

person Ortomala Lokni    schedule 17.03.2015
comment
Я решил принять этот ответ, хотя в конце концов я отправился в Eclipse для отладки кода, поскольку он находится в сторонней библиотеке. Также может работать вставка тела метода в Netbeans. - person coolcfan; 20.03.2015

Для моего конкретного требования с использованием лямбда и потока в Java 8:

Arrays.asList(Thread.currentThread().getStackTrace())
      .stream()
      .anyMatch(e -> e.getMethodName().contains("fetchByABC"))
person coolcfan    schedule 07.04.2015