有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我正在调试一个执行大量方法调用的应用程序。例如,我想调试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();
}

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

这样的事情在Eclipse中可能发生吗?还是有更好的选择


共 (2) 个答案

  1. # 1 楼答案

    怎么样

    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?
    }
    
  2. # 2 楼答案

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

    这个例子

    假设我们有这样一门课:

    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 system属性的值:

    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();
    

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