如何在遇到断点时自动执行 void 方法?

How to execute a void method automatically when a breakpoint is hit?

我正在使用最新的 IntelliJ IDEA Ultimate 16 EAP。我在一个库中有一些代码用一些 setter 初始化一个对象:

X createSomething() {
    X x = new X();
    x.setY(z);
    return x; // breakpoint on this line
}

我正在寻找从调试器修改此返回值的状态:调用 x.setY(y)。我尝试了条件,因为我希望它在断点处的每次命中时发生在断点处停止并且使用 "Evaluate Expression" window 是不可行的。

不可能以任何正常的面向对象的方式(例如覆盖该方法)执行此操作,也不可能在方法外部捕获结果并在那里修改它,因为它在许多调用中很深。

以下是我的尝试,但由于调试器不支持这些语言功能而全部失败。他们失败了,对话框询问 "Would you like to stop at the breakpoint?"。语言级别固定在 Java 6-7 因为我正在开发 Android.

尝试 1:调用方法

Problem processing VM event:
Breakpoint: 'Line 9 in ClassName.createSomething() (package)'
Error: Failed to evaluate breakpoint condition 'x.setY(y)'
Reason: Boolean value expected

也试过像这样的变体:x.setY(y); false;,但它需要是一个表达式。

尝试 2:使用 lambda 调用方法

Problem processing VM event:
Breakpoint: 'Line 9 in ClassName.createSomething() (package)'
Error: Failed to evaluate breakpoint condition '() -> { x.setY(y); return false; }'
Reason: Lambdas evaluation is not supported

尝试 3:调用具有布尔表达式的方法

Problem processing VM event:
Breakpoint: 'Line 9 in ClassName.createSomething() (package)'
Error: Failed to evaluate breakpoint condition 'new java.util.concurrent.Callable<Boolean>() { @Override public Boolean call() { x.setY(y); return false; } }.call()'
Reason: Anonymous class evaluation is not supported

尝试 4:调用静态方法(解决方法)

我找到了一个我想分享的解决方法,但我仍在寻找更好的解决方案(如果有人知道的话):不需要重新编译和重新启动。

  1. 在class中创建方法:

    public class SomeClass {
        public static boolean fixX(X x) {
            x.setY(y);
            return false; // don't actually stop on the breakpoint
        }
    }
    
  2. 在断点条件下添加

    full.pkg.SomeClass.fixX(x)
    

这可行,但任何时候您想要修改条件都必须重新启动应用程序。参数化 fixX(x, changeAbleY) 是一个解决方案。

确保禁用或删除断点,以防止在调试无关问题时因修改行为而引起头痛。

步骤:

  1. 右击断点
  2. 将打开一个工具弹出窗口,在该弹出窗口中单击底部的 "More" link,然后将打开一个 window。
  3. 现在选中 "Log evaluated expression" 复选框 window 并在给定的文本框中输入您的方法调用,例如 methodName()。
  4. 点击确定开始调试。
  5. 当断点到达时,您的方法将在该行执行之前被调用。

参考:https://www.jetbrains.com/idea/help/configuring-breakpoints.html

截图:Screenshot of breakpoint configuration window.

IntelliJ 有一个添加 "Watches" 的功能,您可以在其中执行 void 方法,但这是手动的,不是自动的。