Eclipse 条件断点 - 仅在其他断点之后

Eclipse conditional breakpoint - only after other breakpoint

我正在调试一个执行大量方法调用的应用程序。例如,我想调试 methodA。它被调用了 1000 次。

但是,在我的主循环中,我只想在几条语句后开始调试方法 A。

public void methodA()
{
    //does something nasty that I want to debug
}
public static void main( String[] args )
{
    for (int i=0; i<1000; i++)
    {
        methodA();
    }
    methodB();
    methodA();
}

我想在 methodA 调用 methodB 后才开始闯入。我真的不想更改我的代码(例如,插入一个 boolean 值并使断点以该 boolean 为条件)。

在 Eclipse 中可以实现这样的功能吗?或者有更好的选择吗?

您可以在 eclipse 中为基于变量值的条件使用条件断点。

http://help.eclipse.org/luna/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Freference%2Fbreakpoints%2Fref-condition_option.htm

只需在 methodA 上放置一个断点,当您遇到该断点时,将您的第二个断点添加到 methodB 并继续执行。

怎么样?

public void methodA()
{
    //does something nasty that I want to debug
}
public static void main( String[] args )
{
    for (int i=0; i<1000; i++)
    {
        methodA();
    }
    methodB(); //first breakpoint here? 
    methodA(); //2nd breakpoint here?
}

A) 只需将命中数设为 1000。

只有当 for 循环中的 methodA 不在某些条件下时,它才有效。

B) 使用条件

将断点放在methodA.Refer图像中的第一个语句

[这里methodA == test,我把断点放在第14行]

右键单击断点和select Breakpoint properties选项并添加以下条件。

StackTraceElement[] stacktrace = Thread.currentThread().getStackTrace();
StackTraceElement e = stacktrace[2];
return (e.getLineNumber() == 9);

这里的 9 表示第二次调用 methodA(或测试)的行号 made.Find 在您的代码中相同并更改它。

检查 StackTraceElement 的 javadoc,您也可以使用方法名称代替行号。也就是说,只有当它从函数 xyz.

调用时才能中断

C) 等待日食氧气 (4.7)

在下一版本的eclipse JDT 中将提供断点触发点。所以你可以说命中断点 y ONLY IF breakpoint x 之前被打过

有了这个,您可以仅在给定方法流 [stacktrace] 的断点处暂停。

例如:只有当调用流程为:

时,您才能在断点处停止

methodA() --> methodB() --> methodC() --> methodD() 未开启

methodA() --> methodC() --> methodD()

有关详细信息,请参阅此 bug。将您的 comments/suggestion 添加到此错误中。

我使用系统属性来实现。

例子

假设我们有这个 class:

public class Main {

    public static void main(String[] args) {
        for (int i = 0; i < 1000; i++) {
            methodA();
        }
        methodB();
        methodA();
    }

    private static void methodA() {
        System.out.println("A");
    }

    private static void methodB() {
        System.out.println("B");
    }

}

我们想在 methodA() 中添加一个断点,但仅在调用 methodB() 后才停止,但不向代码添加额外的变量或使用计数器。

设置一个断点属性

首先,让我们在 methodB() 中添加一个断点并使其成为条件。在它的条件下,我们将设置一个系统属性到true。我们不想在 methodB() 内暂停,所以条件将 return false:

System.setProperty("enable.methodA.breakpoint", "true");
return false;

参见下面的 GIF:

检查 属性

的断点

现在,我们在 methodA() 上添加一个断点,也有一个条件。在condition中,我们先获取set system的值属性:

String p = System.getProperty("enable.methodA.breakpoint", "false");

然后,我们将其解析为布尔值,return它:

return Boolean.valueOf(p).booleanValue();

(注意默认值为"false",所以如果不设置属性,断点不会暂停。)

在下面的 GIF 中检查此步骤:

运行

现在,如果我们 运行 这个 class 在调试模式下,methodA() 处的书签只会在调用 methodB() 后暂停:

再次禁用断点

如果 methodA()methodB() 之后调用了很多很多次,而我们只想检查一次,我们最终可以取消设置 属性。例如,假设我们的 main() 方法现在是这样的:

public static void main(String[] args) {
    for (int i = 0; i < 1000; i++) {
        methodA();
    }
    methodB();
    methodA();
    for (int i = 0; i < 1000; i++) {
        methodA();
    }
}

我们可以使用这个条件,我们将 属性 设置回 false 以避免再次停在这个断点:

String p =
    System.getProperty("enable.methodA.breakpoint", "false");

System.setProperty("enable.methodA.breakpoint", "false");

return Boolean.valueOf(p).booleanValue();

当然,这只是一个简单的例子——这个技巧没有限制。