【问题标题】:Debug Scala Macros with Intellij使用 Intellij 调试 Scala 宏
【发布时间】:2013-07-05 17:22:08
【问题描述】:

我有一个 sbt 项目,我运行“gen-idea”来设置它与 Intellij 12.4 一起工作。在一个项目中是我的主要代码,另一个项目中有我的宏代码。当尝试按照http://docs.scala-lang.org/overviews/macros/overview.html 尝试通过测试文件调试我的宏但抛出:

error: scala.reflect.internal.MissingRequirementError: object scala.runtime in compiler mirror not found.
at scala.reflect.internal.MissingRequirementError$.signal(MissingRequirementError.scala:16)
at scala.reflect.internal.MissingRequirementError$.notFound(MissingRequirementError.scala:17)
at scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:48)
at scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:40)
at scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:61)
at scala.reflect.internal.Mirrors$RootsBase.getPackage(Mirrors.scala:172)
at scala.reflect.internal.Mirrors$RootsBase.getRequiredPackage(Mirrors.scala:175)
at scala.reflect.internal.Definitions$DefinitionsClass.RuntimePackage$lzycompute(Definitions.scala:181)
at scala.reflect.internal.Definitions$DefinitionsClass.RuntimePackage(Definitions.scala:181)
at scala.reflect.internal.Definitions$DefinitionsClass.RuntimePackageClass$lzycompute(Definitions.scala:182)
at scala.reflect.internal.Definitions$DefinitionsClass.RuntimePackageClass(Definitions.scala:182)
at scala.reflect.internal.Definitions$DefinitionsClass.AnnotationDefaultAttr$lzycompute(Definitions.scala:1015)
at scala.reflect.internal.Definitions$DefinitionsClass.AnnotationDefaultAttr(Definitions.scala:1014)
at scala.reflect.internal.Definitions$DefinitionsClass.syntheticCoreClasses$lzycompute(Definitions.scala:1144)
at scala.reflect.internal.Definitions$DefinitionsClass.syntheticCoreClasses(Definitions.scala:1143)
at scala.reflect.internal.Definitions$DefinitionsClass.symbolsNotPresentInBytecode$lzycompute(Definitions.scala:1187)
at scala.reflect.internal.Definitions$DefinitionsClass.symbolsNotPresentInBytecode(Definitions.scala:1187)
at scala.reflect.internal.Definitions$DefinitionsClass.init(Definitions.scala:1252)
at scala.tools.nsc.Global$Run.<init>(Global.scala:1290)
at scala.tools.nsc.Driver.doCompile(Driver.scala:32)
at scala.tools.nsc.Main$.doCompile(Main.scala:79)
at scala.tools.nsc.Driver.process(Driver.scala:54)
at scala.tools.nsc.Driver.main(Driver.scala:67)
at scala.tools.nsc.Main.main(Main.scala)

我已检查以确保在我的类路径中包含来自 SCALA_HOME/lib/ 的所有 jar 并且它们是。顺便说一句,这是 Scala v2.10.2

【问题讨论】:

  • 您能否详细说明您是如何运行调试会话的?你使用 Intellij 的调试运行器还是远程调试器?

标签: scala macros intellij-idea


【解决方案1】:

我只想提醒未来的读者,也可以在调试模式下启动你的 sbt,然后远程连接 idea 调试器。

  • 启动 sbt 为:sbt -jvm-debug 5005
  • 在idea中创建一个“远程”“运行/调试配置”(默认端口5005

在idea中运行远程调试配置。这会将它连接到您正在运行的 sbt。然后你可以在你的宏代码中设置断点,当在 sbt 中运行compile 时,idea 应该在断点处停止。

注意:要在成功编译后重新运行 compile,您需要 clean 或更改一些代码

【讨论】:

  • 从 2018 Intellij 开始,sbt 控制台上有一个方便的小“附加调试器”按钮。运行您的命令,它会按预期中断。
【解决方案2】:

正如我们在 #scala 中发现的那样,文档缺少这样一个事实,即需要为调用 scalac 的 JVM 命令提供 -Dscala.usejavacp=true 参数。之后一切正常,我更新了文档:http://docs.scala-lang.org/overviews/macros/overview.html#debugging_macros

【讨论】:

    【解决方案3】:

    关于设置 IntelliJ 以调试 Scala 宏的分步说明:

    1. 首先,您需要有一个单元测试来练习您的宏。假设这个单元测试是项目Macro中的MacroSpec.scala,它包含一个测试类MacroSpec。假设你的项目有包名com.example.project

    2. “运行/编辑配置...” - 您需要在“应用程序”下添加新配置。将此配置称为“宏调试器”。

    3. 在配置上设置各种选项。

      • 主类:scala.tools.nsc.Main - 这是编译器的主类。 (您将调试运行宏的编译器通道。)
      • VM 选项:-Dscala.usejavacp=true
      • 程序参数:这都是一行很长的, -cp com.example.project.MacroSpec /home/YourUserName/path/to/your/project/src/test/scala/com/example/project/MacroSpec.scala 您将需要根据您的实际路径和包名称进行编辑。
      • 工作目录:/home/YourUserName/path/to/your-project。您需要对此进行编辑。
      • 环境变量:您可以留空
      • 使用模块的类路径:macro - 这必须是您的 IntelliJ 项目中包含宏代码及其依赖项的模块。
      • 启动前:“制作,无错误检查”。如果您的测试代码中存在错误,这会有所帮助 - 无论如何都会运行宏。 (在某些情况下,您可能想故意引入错误并在错误代码上调试宏。)
      • 按确定。保存此配置。
    4. 在项目的build.sbtBuild.scala 中,确保macro 模块具有以下依赖关系:"org.scala-lang" % "scala-compiler" % scalaVersion.value % "test"。在这里,您可能想要检查您是否声明了 scalaVersion"test" 选项用于避免将 scala 编译器 JAR 捆绑到您的最终应用程序 JAR 中。

    5. 转到您的宏代码并设置断点。然后运行“宏调试器”。您应该在断点处停止。

    【讨论】:

    • 我按照您提到的所有步骤进行操作,但收到一条错误消息,提示找不到我的主类。
    • 我认为这不再适用于最新版本的 IntelliJ。使用sbt -jvm-debug 5005 之前的答案也许?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 2011-05-08
    • 2014-06-16
    • 2017-11-07
    • 2013-07-06
    • 1970-01-01
    相关资源
    最近更新 更多