【问题标题】:Can't breakpoint the last statement of a code block in Eclipse无法断点 Eclipse 中代码块的最后一条语句
【发布时间】:2011-12-08 19:27:12
【问题描述】:
if (true) {
    String a = "foo";
    String b = "bar";
}

如果我在String a = "foo"; 设置断点,eclipse 将停止,我可以越过变量窗口查看a 的值。但是我不能跳过第二条语句,它只是离开了代码块,我从来没有看到 b 的值。

这迫使我在 String b = "bar"; 之后添加一个 noop 语句,以便我可以看到 b 包含的内容。我也无法在关闭 } 上添加断点,我认为这可能是相关问题。

我知道 Visual Studio 允许这样做,那么在 Eclipse 中有没有办法做到这一点?

【问题讨论】:

  • 你确定你在调试同一个版本的类吗?例如,根据您的构建工具,如果您有多个项目,并且您的主项目位于此源之外的另一个项目中,则它可能正在执行具有不同代码行的旧副本
  • 上面的例子已经测试过了,我很确定,你可以自己试试。在String a = "foo"; 上设置断点使用F6 跳过,你会看到a 的值,再次使用F6,你会跳出代码块。你永远看不到b的价值

标签: java eclipse debugging breakpoints


【解决方案1】:

老实说,我不确定您的 Eclipse 安装中发生了什么。我在 Java 中工作,只是尝试了我能想到的一切。我检查了最后一行 not } 的断点的静态方法,它工作得很好。我对非静态方法进行了同样的检查。

它以这种方式分解:您不能在花括号末端断点,但它将默认为大括号的任何内容,逐行。所以如果你有一个嵌套函数:

public int DoesStuff(int x, int y) {
    if(x > y) {
        DoThing;
    }
    else {
        DoOtherThing;
    }
}

那么最后两个大括号不能断点,但DoThingDoOtherThing 可以。有意义吗?

【讨论】:

  • 我相信你说的是正确的,但它没有回答问题。他的问题似乎是 before 结束大括号 } 的最后一条语句不能有断点,并且在单步执行时会被跳过。
  • 我可以在DoThingDoOtherThing 上中断,以便在函数执行之前停止。但是,如果这些函数返回一个分配给 ex:int myInt = DoThing() 的值并且我跳过它,我看不到分配给 myInt 的值。下一个“中断”将在代码块之外。
  • @Duckies 实际上,您可以在关闭花括号的方法上设置断点 - 请参阅我的答案。
【解决方案2】:

您可以突出显示作业右侧的表达式,然后按 Ctrl+Shift+I(对于 'inspect' I思考)。它将评估表达式并为您提供结果。这样您就可以知道b 的值,而无需在赋值后设置断点。

【讨论】:

  • @rtaranu:我不认为这是一个杂牌,这对我来说似乎很明智。由于调试器无法在} 上中断,并且因为在您中断它时最后一个赋值语句尚未执行,所以无论如何在该点中断并让调试器评估右手是非常合乎逻辑的为你表达的一面。
  • @robjb:这是一个杂项,因为如果分配的右侧有副作用(修改程序状态的函数),那么它将被评估一次,所以我可以看到值,然后再次让程序继续。所以我在检查程序时修改了程序的行为。
  • @rtaranu:我非常希望调试器足够聪明,可以将任何更改推送到自己的堆栈中,并在恢复控制流时将其弹出。否则,这样的功能怎么会起作用?
  • @robjb:实际上调试器并不那么聪明(我测试过),而且在很多情况下也不能。例如:您的右侧执行了一个无法从堆栈中弹出的 IO 操作(数据库/文件/套接字/其他)。
  • 一个杂物——看我的回答。
【解决方案3】:

如果结束语句是赋值并且它在局部变量上,为什么要查看它的值,因为它不再在范围内并且无法生效。

如果它设置了相同的类属性,那么当你从这个调用返回时你可以看到它,并且你有这个方法操作的对象。

虽然这不能回答问题,但我正在尝试了解您的问题的用例。

【讨论】:

  • 用例是我在 3rd 方库中调用了一个记录不充分的函数,我想看看它返回什么。或者我正在编写一些代码,我想在继续编写之前仔细检查该值。
  • 对于第三方库中的函数,你可以通过watch或者inspect来评估函数调用。因此,当您编写代码时,您会遇到这个问题:)。
  • 它与变量的范围无关(好吧,有点,因为断点应该在清理完成之前设置的地方)。如果 Eclipse 不能在 } 上设置断点,那是 Eclipse 的问题,而不是技术限制。一般来说,调试器可以很好地打破},例如Visual Studio 可以。
【解决方案4】:

不可能在任意块的末尾设置断点(没有字节码黑客)。

如果它是一个方法体,那么它可能的:你可以设置一个方法断点。双击方法定义行:

注意到小箭头了吗?)然后在断点视图中,选择断点以在显示的属性中看到EntryExit 选项复选框:

小箭头表示,默认情况下,我们在方法的入口上设置了一个断点。

现在选择Exit(并取消选择Entry),您将在断点视图中看到:

(有一个不同的小箭头,表示退出断点。)

现在在这个小断路器('Debug As a Java Application')上运行调试器,它将在方法的出口大括号处停止

并且局部变量(在这种情况下只有 a)现在在 Variables 视图中可见(具有正确的值):

值得注意的是,这种类型的断点会捕获方法退出,但是这种情况会发生 - 例如,如果我们通过抛出异常退出。

【讨论】:

  • 查看this answer,直到我查看后才发现:-( 这是旧建议,我的建议略有不同,适用于 Eclipse 3.7.2。
  • 在 IntelliJ 中,我可以在任意代码块的末尾放置断点(不一定是方法)。他们一定是在幕后进行“字节码黑客”?
猜你喜欢
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 2017-01-05
  • 1970-01-01
  • 1970-01-01
  • 2012-05-11
  • 1970-01-01
相关资源
最近更新 更多