【发布时间】: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:调用静态方法(解决方法)
我找到了一个我想分享的解决方法,但如果有人知道,我仍在寻找更好的解决方案:不需要重新编译和重新启动。
-
在类中创建方法:
public class SomeClass { public static boolean fixX(X x) { x.setY(y); return false; // don't actually stop on the breakpoint } } -
在断点条件下添加
full.pkg.SomeClass.fixX(x)
这可行,但任何时候您想修改条件都必须重新启动应用程序。参数化的fixX(x, changeAbleY) 是一个解决方案。
确保禁用或删除断点,以防止在调试无关问题时因修改行为而头疼。
【问题讨论】:
标签: java android debugging intellij-idea java-7