如何在遇到断点时自动执行 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:调用静态方法(解决方法)
我找到了一个我想分享的解决方法,但我仍在寻找更好的解决方案(如果有人知道的话):不需要重新编译和重新启动。
在class中创建方法:
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)
是一个解决方案。
确保禁用或删除断点,以防止在调试无关问题时因修改行为而引起头痛。
步骤:
- 右击断点
- 将打开一个工具弹出窗口,在该弹出窗口中单击底部的 "More" link,然后将打开一个 window。
- 现在选中 "Log evaluated expression" 复选框 window 并在给定的文本框中输入您的方法调用,例如 methodName()。
- 点击确定开始调试。
- 当断点到达时,您的方法将在该行执行之前被调用。
参考:https://www.jetbrains.com/idea/help/configuring-breakpoints.html
截图:Screenshot of breakpoint configuration window.
IntelliJ 有一个添加 "Watches" 的功能,您可以在其中执行 void 方法,但这是手动的,不是自动的。
我正在使用最新的 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 inClassName.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 inClassName.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 inClassName.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:调用静态方法(解决方法)
我找到了一个我想分享的解决方法,但我仍在寻找更好的解决方案(如果有人知道的话):不需要重新编译和重新启动。
在class中创建方法:
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)
是一个解决方案。
确保禁用或删除断点,以防止在调试无关问题时因修改行为而引起头痛。
步骤:
- 右击断点
- 将打开一个工具弹出窗口,在该弹出窗口中单击底部的 "More" link,然后将打开一个 window。
- 现在选中 "Log evaluated expression" 复选框 window 并在给定的文本框中输入您的方法调用,例如 methodName()。
- 点击确定开始调试。
- 当断点到达时,您的方法将在该行执行之前被调用。
参考:https://www.jetbrains.com/idea/help/configuring-breakpoints.html
截图:Screenshot of breakpoint configuration window.
IntelliJ 有一个添加 "Watches" 的功能,您可以在其中执行 void 方法,但这是手动的,不是自动的。