就像这个问题一样,在调试应用程序时,我想让应用程序只有在当前调用堆栈有某个方法时才暂停在断点处。但是,我使用的是 Netbeans。
在 Java 中,可以通过多种方式获取当前调用堆栈,例如
Thread.currentThread().getStackTrace()
它返回一个堆栈跟踪元素数组。
是否可以遍历数组(或转换后的列表),检查方法名称并仅在一行中返回布尔值?
或者,如果我需要编写一个方法来检查数组并根据感兴趣的方法的存在返回布尔值,我应该把它放在哪里?
就像这个问题一样,在调试应用程序时,我想让应用程序只有在当前调用堆栈有某个方法时才暂停在断点处。但是,我使用的是 Netbeans。
在 Java 中,可以通过多种方式获取当前调用堆栈,例如
Thread.currentThread().getStackTrace()
它返回一个堆栈跟踪元素数组。
是否可以遍历数组(或转换后的列表),检查方法名称并仅在一行中返回布尔值?
或者,如果我需要编写一个方法来检查数组并根据感兴趣的方法的存在返回布尔值,我应该把它放在哪里?
对于我的特定要求,在 Java 8 中使用 lambda 和流:
Arrays.asList(Thread.currentThread().getStackTrace())
.stream()
.anyMatch(e -> e.getMethodName().contains("fetchByABC"))
您可以在堆栈上添加私有方法测试条件并从条件断点调用它。这是一个概念证明:
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()
。