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

Java Eclipse条件断点-仅在其他断点之后,java,eclipse,debugging,breakpoints,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();

我正在调试一个执行大量方法调用的应用程序。例如,我想调试
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();
}
public void methodA()
{
//做了一些我想调试的讨厌的事情
}
公共静态void main(字符串[]args)
{

对于(inti=0;i您可以在eclipse中使用条件断点来处理基于变量值的条件


只要在
方法a
上设置一个断点,当您到达该断点时,将第二个断点添加到
方法B
并继续执行。

如何

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?
}
public void methodA()
{
//做了一些我想调试的讨厌的事情
}
公共静态void main(字符串[]args)
{
对于(int i=0;iA),只需使用命中计数1000即可。

只有当methodA-inside-for循环不在某些条件下时,它才起作用

B)使用条件

将断点放在methodA中的第一条语句处。参考图

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

右键单击断点并选择
断点属性
选项并添加以下条件

StackTraceElement[]stacktrace=Thread.currentThread().getStackTrace();
StackTraceElement e=stacktrace[2];
返回(例如getLineNumber()==9);
这里9表示第二次调用methodA(或test)的行号。请在代码中找到相同的行号并更改此行号

检查javadoc的行号,而不是行号,您也可以使用方法名。也就是说,只有当它从函数
xyz
调用时,才可以中断

C)等待日食氧气(4.7)

在eclipse的下一个版本中,JDT将提供断点上的触发点。因此,只有在断点x以前被命中时,才可以说命中断点y

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

例如:只有在调用流为以下情况下,才能在断点上停止:

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

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


有关更多详细信息,请参阅此。将您的评论/建议添加到此错误。

我使用系统属性来实现此目的

榜样 假设我们有这个类:

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");
    }

}
请参见下面的GIF:

检查属性的断点 现在,我们将断点添加到
methodA()
,同时添加一个条件。在条件中,我们首先获得set系统属性的值:

String p = System.getProperty("enable.methodA.breakpoint", "false");
然后,我们将其解析为布尔值并返回:

return Boolean.valueOf(p).booleanValue();
(请注意,默认值为
“false”
,因此如果未设置属性,断点将不会暂停。)

在下面的GIF中选中此步骤:

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

再次禁用断点 如果
methodA()
methodB()
之后多次调用
methodA()
,并且我们只想检查一次,我们最终可以取消设置属性。例如,假设我们的
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();
    }
}

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

然后我需要修改我的代码,以便能够使用带有值的变量。我不想这样做(如我的问题中所述),如果您的methodB()不更改任何变量,此解决方案不起作用。这就是我现在所做的,效率很低,因为我需要找到断点、启用断点、禁用断点等@RobAu如果每次执行只转换一次,则不需要太多努力。如果您多次执行,您希望Eclipse如何知道何时“恢复”到pre-
方法B
状态?非常聪明的方法B!谢谢:D@RobAu编辑了我的答案并添加了一个方法。请检查。谢谢@Chandrayya,我期待它。该功能在Eclipse Oxygen中被称为“触发点”,它与这里描述的完全相同。谢谢你的提示!
public static void main(String[] args) {
    for (int i = 0; i < 1000; i++) {
        methodA();
    }
    methodB();
    methodA();
    for (int i = 0; i < 1000; i++) {
        methodA();
    }
}
String p =
    System.getProperty("enable.methodA.breakpoint", "false");

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

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