使用Netbeans和Java调用堆栈上的条件断点

时间:2015-03-05 04:02:40

标签: java debugging netbeans conditional-breakpoint

就像this question一样,在调试应用程序时,我想让应用程序仅在当前调用堆栈具有某种方法时才在断点处暂停。但是,我正在使用Netbeans。

在Java中,可以通过多种方式获得当前的调用堆栈,例如

Thread.currentThread().getStackTrace()

返回堆栈跟踪元素数组。

是否可以遍历数组(或转换后的列表),检查方法名称并在一行中返回一个布尔值?

或者,如果我需要编写一个检查数组的方法并根据感兴趣的方法的存在返回布尔值,我应该把它放在哪里?

2 个答案:

答案 0 :(得分:1)

根据我的具体要求,在Java 8中使用lambda和stream:

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

答案 1 :(得分:0)

您可以在堆栈上添加私有方法测试条件,并从条件断点调用它。这是一个概念证明:

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()时,应用程序才会在断点处暂停。