非线性依赖条件断点

时间:2010-01-22 15:08:25

标签: java debugging ide jvm

是否可以设置断点,以便在指令处于某种条件true后程序停止执行?

一个类有一个名为currency的变量,我想创建一个断点,使程序在currency == 20之后的任何一行停止。我不知道currency被更改的行号,所以这就像在我的班级的每行中放置一个断点[编辑。 currency变更的地方。

有没有办法实现这一点(除了在每一行添加一个断点)?

我正在使用NetBeans,但欢迎在任何其他IDE中使用解决方案。

4 个答案:

答案 0 :(得分:3)

以下是有关在NetBeans中设置条件断点的链接:http://www.java-hair.com/?p=61

相关文字:

  

在NetBeans中,创建一个断点   右键点击粉红色的小方块   这意味着休息。点击   “定制”。自定义对话框时   出现,检查“条件”并填写   在这种情况下。以上就是一个例子   在NetBeans中使用此对话框。

它们还包括Eclipse和JDeveloper。

修改:响应您的评论 - 不,这不能按您希望的方式完成。调试器设置断点的方法是更改​​设置断点的指令中的字节。当评估指令时,该字节的存在将控制转移到调试器,调试器用之前的任何内容替换该字节。当恢复执行时,调试器将指令指针移动到设置断点的指令。

单行上的条件断点很容易实现 - 当控制转移到调试器时,他只是检查条件,如果不是,则自动恢复执行。

那么,如果您不必将条件断点附加到一行,它将如何工作?它必须附加到每一行(就像你猜测你需要做的那样才能实现这个效果)。我没有必要这样做,但我想这将是不可取的,因为它会大大减慢程序执行速度。更好的方法可能是使用您的IDE搜索所有货币实例的代码,以查看它可能设置的位置,并在那里放置条件断点。

答案 1 :(得分:3)

改变你编写软件的方式。

而不是:

public class BreakEncapsulation {
  private float currency = 0.0;

  public BreakEncapsluation() {
    this.currency += 5;
  }

  public void updateCurrency() {
    this.currency = 20.0;
  }

  public void increaseCurrencyByRate() {
    this.currency += 2;
  }

  public void decreaseCurrencyByRate() {
    this.currency -= 2;
  }
}

这样做:

public class HonourEncapsulation {
  private float currency;

  public HonourEncapsluation() {
    setCurrency( getCurrency() + 5 );
  }

  public void updateCurrency() {
    setCurrency( 20.0 );
  }

  public void increaseCurrencyByRate()  {
    setCurrency( getCurrency() + getRate() );
  }

  public void decreaseCurrencyByRate() {
    setCurrency( getCurrency() - getRate() );
  }

  public void setCurrency( float currency ) {
    System.out.println( "Old currency = " + this.currency );

    // Set the break point here. This is the only spot in the entire system
    // where the value of currency changes. This idea follows the DRY
    // principle: every piece of information should have exactly one
    // occurrence.
    //
    this.currency = currency;

    System.out.println( "New currency = " + this.currency );
  }

  private float getCurrency() { return this.currency; }

  private float getRate() { return 2.0; }
}

这不仅有助于维护代码(无代码重复),还可以保持开放的可能性。它可能对您当前的问题没有帮助,但它将帮助您避免将来出现许多问题。

这是一种名为 encapsulation 的技术,与信息隐藏密切相关。

答案 2 :(得分:0)

这在Intellij IDEA和Eclipse中都是可能的,以及其他类型的条件断点。此功能是IDE的功能,而不是JVM。

答案 3 :(得分:0)

在Eclipse中,可以设置在更改变量时要检查的条件断点。

但是,一般条件不可能被打破“这个复杂条件变为真的那一刻”