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

时间:2015-06-09 07:12:07

标签: java eclipse debugging breakpoints

我正在调试一个执行大量方法调用的应用程序。我想,例如,调试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中是否可以这样?或者有更好的选择吗?

5 个答案:

答案 0 :(得分:8)

A)只需将点击次数设为1000。

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

B)使用条件

将断点放在methodA.Refer image

中的第一个语句处

[此处方法A ==测试我在第14行设置断点]

enter image description here

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

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

这里9表示第二次调用methodA(或test)的行号。在代码中找出它并更改它。

检查StackTraceElement的javadoc,而不是行号,您也可以使用方法名称。即只有在从函数xyz调用时才能中断。

enter image description here

C)等待日食氧气(4.7)

在Eclipse的下一个版本中,JDT将在断点上提供触发点。所以你可以说点击断点 y 只有在之前点击了断点 x

使用此功能,您只能在给定的方法流[stacktrace]上暂停断点。

例如:只有在呼叫流程为:

时才能在断点处停止

methodA() --> methodB() --> methodC() --> methodD()不在

methodA() --> methodC() --> methodD()等。

有关详细信息,请参阅此bug。将您的意见/建议添加到此错误中。

答案 1 :(得分:3)

我使用系统属性来实现这一点。

示例

假设我们有这个课程:

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()内暂停,因此条件将返回false

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

请参阅下面的GIF:

Adding first condition to <code>methodB()</code>

检查属性的断点

现在,我们向methodA()添加一个断点,同时还有一个条件。在这种情况下,我们首先得到set系统属性的值:

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

然后,我们将其解析为布尔值并返回它:

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

(请注意,默认值为"false",因此如果未设置属性,断点将不会暂停。)

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

Add bookmark that checks system property.

运行

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

<code>methodA()</code> is only paused after <code>methodB()</code>

再次禁用断点

如果在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();

这当然只是一个简单的例子 - 天空是这个技巧的极限。

答案 2 :(得分:1)

答案 3 :(得分:0)

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

答案 4 :(得分:0)

怎么样?

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?
}