【问题标题】:Scala no-op that is guaranteed not to be optimised away?保证不会被优化掉的Scala no-op?
【发布时间】:2012-09-20 05:51:59
【问题描述】:

您可以在 Scala 方法的结束 } 上设置断点,但这样做毫无意义,因为它显然不会被命中。

我还是想把它放在那里。所以我想,“我在该行之前放置一个空操作,并在其上设置一个断点怎么样?”

但是,当我尝试设置一个永远不会被命中的断点时,显然 Eclipse 没有警告我(因为那里没有代码),因此我不能依赖 Eclipse 告诉我是否优化了无操作out(特别是因为我什至没有使用与 Eclipse Scala 插件使用的相同版本的 Scala 来运行代码)。

那么,我可以在这里使用一个简短的无操作语句或表达式,保证在任何情况下都不会被 Scala 编译器优化掉 - 并且保证不会被优化掉通过 JIT 以防止断点被击中的方式?我想在我的例子中它必须是一个表达式而不是一个语句,因为这个方法返回一个有用的值,而不是Unit

【问题讨论】:

    标签: eclipse scala scalac noop


    【解决方案1】:

    这并不完全是空操作,但保证不会优化日志语句(或跟踪表达式 - 即另外返回刚刚记录的值的日志语句)!

    唯一的问题是,如果您想查看它实际输出的内容,则每次遇到断点时都必须手动跳过调试语句或跟踪表达式。除非它只是输出变量的值,在这种情况下,您可以在 Eclipse 的“变量”选项卡中找到该变量。

    至少在我的代码中,在“旧式调试模式”下使用 Eclipse Scala 插件 2.1 里程碑 2 跨过跟踪表达式并非小事 - 因为它完全被破坏了,因为 this issue

    在我意识到发生了什么之前,我花了大约 20 次尝试敲击 F6 和 F7 键,才终于成功跨过它!这只是为了踩它一次

    请记住,下一行是} - 所以显而易见的解决方法是在下一行设置另一个断点 - 行不通!

    理论上你应该能够Inspect the value being traced,而不是试图跨过跟踪。不幸的是,这对我也不起作用 - 它说找不到类。

    【讨论】:

      猜你喜欢
      • 2019-12-15
      • 2019-05-12
      • 1970-01-01
      • 1970-01-01
      • 2013-10-19
      • 1970-01-01
      • 1970-01-01
      • 2012-05-05
      • 2011-08-01
      相关资源
      最近更新 更多