调试器中的 Eclipse Mars (4.5) 热插拔代码无法正常工作
Eclipse Mars (4.5) hot swap code in debugger not working
所以我更新到 Eclipse Mars (4.5) 并且由于某种原因我无法在调试器中使用热插拔代码。通常我可以这样做:
public static void main(String[] args){
while(true){
System.out.println("123");
}
}
然后如果我在调试模式下启动它,将文本更改为“321”,然后保存,然后它会更新而不需要重新启动它。它的行为与 "Run" 模式下的 运行 完全一样,而不是 "Debug".
我尝试过的:
- 创建一个新的工作区,创建一个新的项目,使用上面的代码,没有任何反应
- 安装了几个 JDK,尝试过 java 6、7 和 8,更改了工作区 and/or 项目设置以使用不同的 JDK,没有任何反应(事实上我有几个安装的 java 版本无关紧要,因为就在我更新 eclipse 的那一刻它停止工作)
- 尝试卸载并删除任何配置文件到 eclipse(在 mac 上,这样在 ~/Library 文件夹中每个 file/folder 都带有单词 "eclipse",运行 a "find" 搜索以检测所有文件)。然后尝试创建一个新的工作区,现在是项目,代码被截断,运行 在调试模式下,保存时没有任何反应。
- 还确保我已启用 "Auto Build",甚至尝试 "clean" 它,并禁用自动构建,然后保存代码,然后在调试器处于 [=43] 时进行手动构建=]ning: 什么都没发生
我开始感到绝望,因为我很难在没有可用调试模式的情况下完成工作,所以任何 help/hints 方向正确的人都会非常感激。
HotSwap 不适用于静态方法。
但是它与实例方法一起工作得很好,所以它会在这段代码上工作:
public class Main {
public static void main(String[] args) {
new Main().f();
}
public void f() {
while(true){
System.out.println("123");
}
}
}
好的,所以我终于找到了问题所在。似乎您无法在 运行 时编辑循环。假设你有这样一个循环:
public static void main(String[] args){
while(true){
System.out.println("123");
}
}
那么你不能编辑“123”字符串。
您可以像这样编辑在循环内调用的方法:
public static void main(String[] args){
while(true){
System.out.println(methodA());
}
}
public static String methodA(){
return "123";
}
现在您可以编辑字符串“123”,它会更新。
这也适用于无限 "for" 循环,所以猜测经验法则是方法体必须在更新之前 "re-called" ,并且等待下一个循环调用是不够的。
所以我更新到 Eclipse Mars (4.5) 并且由于某种原因我无法在调试器中使用热插拔代码。通常我可以这样做:
public static void main(String[] args){
while(true){
System.out.println("123");
}
}
然后如果我在调试模式下启动它,将文本更改为“321”,然后保存,然后它会更新而不需要重新启动它。它的行为与 "Run" 模式下的 运行 完全一样,而不是 "Debug".
我尝试过的:
- 创建一个新的工作区,创建一个新的项目,使用上面的代码,没有任何反应
- 安装了几个 JDK,尝试过 java 6、7 和 8,更改了工作区 and/or 项目设置以使用不同的 JDK,没有任何反应(事实上我有几个安装的 java 版本无关紧要,因为就在我更新 eclipse 的那一刻它停止工作)
- 尝试卸载并删除任何配置文件到 eclipse(在 mac 上,这样在 ~/Library 文件夹中每个 file/folder 都带有单词 "eclipse",运行 a "find" 搜索以检测所有文件)。然后尝试创建一个新的工作区,现在是项目,代码被截断,运行 在调试模式下,保存时没有任何反应。
- 还确保我已启用 "Auto Build",甚至尝试 "clean" 它,并禁用自动构建,然后保存代码,然后在调试器处于 [=43] 时进行手动构建=]ning: 什么都没发生
我开始感到绝望,因为我很难在没有可用调试模式的情况下完成工作,所以任何 help/hints 方向正确的人都会非常感激。
HotSwap 不适用于静态方法。
但是它与实例方法一起工作得很好,所以它会在这段代码上工作:
public class Main {
public static void main(String[] args) {
new Main().f();
}
public void f() {
while(true){
System.out.println("123");
}
}
}
好的,所以我终于找到了问题所在。似乎您无法在 运行 时编辑循环。假设你有这样一个循环:
public static void main(String[] args){
while(true){
System.out.println("123");
}
}
那么你不能编辑“123”字符串。 您可以像这样编辑在循环内调用的方法:
public static void main(String[] args){
while(true){
System.out.println(methodA());
}
}
public static String methodA(){
return "123";
}
现在您可以编辑字符串“123”,它会更新。 这也适用于无限 "for" 循环,所以猜测经验法则是方法体必须在更新之前 "re-called" ,并且等待下一个循环调用是不够的。