【问题标题】:Debugging last statement in a condition in Eclipse is not possible?无法在 Eclipse 中调试条件中的最后一条语句?
【发布时间】:2013-06-05 14:37:08
【问题描述】:
public static void main(String args[])
{
  if(true)
    {
      int x= 3*44+7;
      //int y=1;
    }
}

我将我的问题缩小到这个简单的语句,我真的不知道如何在 Eclipse 调试器中访问这个变量。它总是发生在变量在 if 条件、try-catch 语句、循环等中声明的情况下,并且意外地是该块中的最后一个语句。

为了解决这个问题,我停止调试会话,在该块中添加另一个语句,重做我刚刚做的所有事情。有更好的解决方案吗?

【问题讨论】:

  • 我是 Visual Studio/.NET 的人,在调试大括号时被认为是语句的最后一步。太糟糕了,在 java/eclipse 中显然不是这样
  • 另见重复 SO 问题的方法断点:stackoverflow.com/questions/7785887/…

标签: java eclipse debugging


【解决方案1】:

你是对的,很难看到最后一条语句的值:当你通过最后一行时,程序终止。

解决方法可以是在该语句之后添加虚拟行并将断点放在那里,或者使用“表达式”视图并将x(即3*44+7)的表达式放在那里。

顺便说一句,请注意这不是现实世界中程序比 1 个可执行行长一点的典型情况。 :)

【讨论】:

  • 它与一行无关。它与任何块中的最后一行有关
  • @M.C.在其块的最后一行声明的变量永远不会存在。 int x= 3*44+7; 因为块的最后一行没有副作用,结果是死的,所以执行它会浪费处理器周期。
  • @PatriciaShanahan 这是一个很好的观点,但作为一个调试器(er)我希望这个语句被执行以用于调试目的。如前所述,VS 似乎考虑到了这一点。
  • @M.C.与其花时间和精力调试它,不如删除死声明?
  • @PatriciaShanahan 我在测试阶段进行声明,并使用鼠标悬停在对象上时出现的 Inspect 视图来获取有关该对象的更多信息。如果我释放应用程序并且仍然有最后一行代码,那么执行它将浪费处理器周期。正如这个问题的答案所示,我现在使用“显示”窗口来避免该问题。但我仍然宁愿在测试时查看任何对象的检查视图,而不必键入仅通过悬停即可获得的内容。
【解决方案2】:

运行最后一个“语句”,只是看不到变量结果,因为:

  1. 该变量在此语句之前不存在。

  2. 执行语句时变量不存在 - 最后一步是将结果值赋给变量。

  3. 该变量本来应该存在于下一行,但该行结束了声明该变量的范围,因此该变量不再存在。

在一个更“真实世界”的例子中,你可以做这样的事情 -

变化:

public int doIt() {
    return 3*44+7;
}

收件人:

public int doIt() {
    int x = 3*44+7;
    return x;
}

并在'return'行设置断点。

【讨论】:

  • 另一个选项,在 Eclipse 中,将操作添加到“表达式”视图(在调试后选择编辑器中的代码,然后右键单击并选择“观看”
  • @Pablo Expression 视图是一个我不熟悉的有用视图,但不幸的是它不能解决这个问题
【解决方案3】:

在您的情况下,编译器实际上可能会删除赋值,因为变量 x 以后永远不会使用。

无论如何...您可以在调试器中使用的一种解决方法(假设您要调试的语句不是状态更改)是使用剪贴簿或使用检查。

http://www.ibm.com/developerworks/library/os-ecbug/ 图 7 和 8

您可以突出显示一个表达式(语句的一部分或整个语句)并检查我相信。 (几个月没用过eclipse)。另一种方法是停在该行(因此在表达式触发之前)并将该行复制到您的显示视图中,然后在那里运行它。

它将在当前堆栈帧中运行,因此您所有的本地对象都可用。 但是,运行 set 和其他状态更改调用实际上会更改程序的状态。 (这并不理想,但它胜过停止调试器)

【讨论】:

  • 使用您在链接中提到的显示器解决了我的问题。我不知道 Eclipse 中存在一个执行即时代码的窗口。并且使用该窗口,我可以避免重新启动我的整个应用程序来添加虚拟行!
【解决方案4】:

我看不到您的问题的任何解决方案。 由于您只能看到当前行之前定义的变量,因此您显然需要在变量声明之后声明。 如果没有语句,则您的变量不再在当前范围内(在您的情况下,您的程序结束),因此无法查询。

顺便说一句,您说您停止了调试会话。使用 HotSwap,您可以动态替换当前方法的代码并在方法的开头重新开始调试(请参阅调试器中的“拖放到帧”)

【讨论】:

  • Drop Frame 是一个我不知道的有用功能,但我无法添加其他语句,并且我阅读它不允许更改所有内容。正如你已经说过的,可能没有解决方案
猜你喜欢
  • 2011-12-08
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
  • 1970-01-01
  • 2012-05-11
  • 2011-11-29
  • 2022-01-03
  • 1970-01-01
相关资源
最近更新 更多