使用 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"))
就像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"))