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

时间:2016-02-06 18:39:48

标签: java android debugging intellij-idea java-7

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

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

我希望从调试器修改此返回值的状态:调用x.setY(y)。我尝试了条件,因为我希望它发生在断点处断点的每次击中并使用"评估表达式"窗户是不可行的。

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

以下是我的尝试,由于调试器中不支持这些语言功能而全部失败。他们通过对话询问"你想在断点处停下来失败了吗?"。语言级别固定为Java 6-7,因为我正在为Android开发。

尝试1:调用方法

  

处理VM事件的问题:
  断点:ClassName.createSomething()(包)中的第9行'
  错误:无法评估断点条件' x.setY(y)'
  原因:预期布尔值

还尝试了类似的变体:x.setY(y); false;,但它需要是一个表达式。

尝试2:使用lambda

调用方法
  

处理VM事件的问题:
  断点:ClassName.createSomething()(包)中的第9行'
  错误:无法评估断点条件' () -> { x.setY(y); return false; }'
  原因:不支持Lambda评估

尝试3:调用方法以使用布尔表达式

  

处理VM事件的问题:
  断点:ClassName.createSomething()(包)中的第9行'
  错误:无法评估断点条件&#39; new java.util.concurrent.Callable<Boolean>() { @Override public Boolean call() { x.setY(y); return false; } }.call()&#39;
  原因:不支持匿名类评估

尝试4:调用静态方法(工作方法)

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

  1. 在类中创建方法:

    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)
    
  3. 这样可行,但只要您想要修改条件,您就必须重新启动应用。参数化fixX(x, changeAbleY)是解决方案。

    确保在调试不相关的问题时禁用或删除断点以防止因修改后的行为而出现问题。

1 个答案:

答案 0 :(得分:2)

步骤:

  1. 右键点击断点
  2. 将打开一个工具弹出窗口,在弹出窗口中单击&#34;更多&#34;在底部链接然后会打开一个窗口。
  3. 现在检查&#34;记录评估表达式&#34;该窗口中的复选框,并在给定的文本框中输入您的方法调用,例如methodName()。
  4. 单击“确定”并开始调试。
  5. 当断点发生时,你的方法会在该行的执行之前被调用。
  6. 参考:https://www.jetbrains.com/idea/help/configuring-breakpoints.html

    屏幕截图:Screenshot of breakpoint configuration window.

    IntelliJ有一项功能可以添加&#34;手表&#34;你可以在哪里执行你的void方法,但这是手册,而不是自动的。