使用 Netbeans 和 Java 在调用堆栈上设置条件断点

Conditional Breakpoints on Call Stack with Netbeans and Java

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

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

Thread.currentThread().getStackTrace()

其中 return 是一个堆栈跟踪元素数组。

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

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

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

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") 作为条件,则只有当从 m1() 中调用 m2() 时,应用程序才会在断点处暂停。

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

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