【问题标题】:How to execute a void method automatically when a breakpoint is hit?遇到断点时如何自动执行void方法?
【发布时间】:2016-02-06 18:39:48
【问题描述】:

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

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; }
原因:不支持 Lambdas 评估

尝试3:调用方法得到布尔表达式

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

尝试 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)
    

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

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

【问题讨论】:

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


    【解决方案1】:

    步骤:

    1. 右键单击断点
    2. 将打开一个工具弹出窗口,在该弹出窗口中单击底部的“更多”链接,然后将打开一个窗口。
    3. 现在选中该窗口中的“记录评估表达式”复选框,并在给定的文本框中输入您的方法调用,例如 methodName()。
    4. 点击确定开始调试。
    5. 当断点命中时,您的方法将在该行执行之前被调用。

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

    截图:Screenshot of breakpoint configuration window.

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

    【讨论】:

    • 棒极了,不错的匿名用户!
    • 还值得取消选中“全部暂停”复选框或添加一个始终为“假”的条件,这样断点命中不会停止执行。
    • @TWiStErRob 谢谢,在学习期间得到了太多别人的帮助,才开始帮助别人。
    • 这将在每次执行时打印“void”。另一种方法是在“条件”字段上调用函数。表达式应该是; "{ methodToCall(); return false; }" (如果你想在那个断点处停止执行,你应该替换为 "return true")。
    猜你喜欢
    • 2018-03-15
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    相关资源
    最近更新 更多