如何使用Eclipse调试Scala宏

如何使用Eclipse调试Scala宏,scala,scala-macros,Scala,Scala Macros,我试图使用EclipseIDE在Scala宏实现中设置断点,但失败了 首先:Scala宏摇滚乐!到目前为止,我更喜欢Clojure而不是Scala,但对于宏我不再确定 我试图创建一个宏,它将返回函数的toString和函数本身。当它起作用时,我将用一个合理的toString创建一个新函数。啊,快乐的日子 但是我需要能够调试宏。我使用Eclipse(20110615-0604)和Scala(2.10.1)。我下载了scala-compiler-2.10.1.jar,代码现在就可以运行了。我还编写了

我试图使用EclipseIDE在Scala宏实现中设置断点,但失败了

首先:Scala宏摇滚乐!到目前为止,我更喜欢Clojure而不是Scala,但对于宏我不再确定

我试图创建一个宏,它将返回函数的toString和函数本身。当它起作用时,我将用一个合理的toString创建一个新函数。啊,快乐的日子

但是我需要能够调试宏。我使用Eclipse(20110615-0604)和Scala(2.10.1)。我下载了scala-compiler-2.10.1.jar,代码现在就可以运行了。我还编写了几个简单的宏。这些宏位于eclipse项目“ScalaMacro”中,使用它们的代码位于单独的项目“HelloScalaMacro”中

我现在想调试它们

按照上的说明,我创建了一个以scala.tools.nsc.Main为入口点的运行时配置。我添加了-cp HelloScala.scala,当我运行配置时,它实际上似乎在编译代码(如果我输入错误,它会正确地报告错误)

不幸的是,这些指令暗示宏实现中的断点应该导致Eclipse暂停。没有

我做了通常的工作:谷歌搜索Eclipse/Scala宏/Debug/Breakpoint,阅读Scala宏标记中的所有stackoverflow问题,并对我能找到的每个Eclipse设置进行了大量的研究


所以,如果你们中有人知道如何设置断点,请告诉我:它是eclipse版本还是scala版本。。。问题?

我自己没有尝试过,原则上,失败的可能性(或更大的可能性)与您已经尝试过的一样,但如果成功,对您来说可能更方便

要尝试这一点,您应该安装Scala IDE和源功能。确保您正在进行的Eclipse安装是“EclipseClassic”、“EclipseforRCP开发人员”或您自己提出的类似组合

您还需要安装Equinox编织启动器插件,该插件将允许您创建一个“带有Equinox编织的Eclipse应用程序”启动器

现在:

  • 创建一个新的工作区
  • 创建Scala项目
  • 在该项目中植入宏代码
  • 在宏源中添加断点
  • 准备调试:

  • 创建一个新的“EclipseApplicationwithEquinoxWeaving”调试启动配置。给出一个比“新配置”更优雅的名称

    • 在“位置”下,将其指向一个新的不同的工作区目录
    • 在“配置”选项卡下,提供类似“-Xmx1536m”的内容
    • 默认情况下,所有可用于运行Eclipse实例的插件都应可用于即将启动的实例。Eclipse可能需要一些哄骗,以便在类路径中包含一个非插件项目——如果这不起作用,这是我首先要考虑的
  • 您现在需要启动调试配置

    • 根据您的Scala IDE版本,您可能会遇到“多个可用启动器--选择一个…”警告。我会选择“支持Equinox编织的Eclipse应用程序启动器”
  • 一旦进入正在调试的Eclipse实例中:

  • 创建要使用宏的项目
  • 确保添加对二进制输出的依赖关系
  • 将宏的一个小用法示例添加到正在调试的工作区中的项目中
  • 祝你好运
  • 建造

  • 从理论上讲,启动Eclipse实例现在将在断点处暂停正在调试的实例。

    Nadavwr(就在下面)给出的说明很有帮助,我向其他人推荐它们

    对我来说,关键的解决方案是认识到涉及到两个项目,一个是定义宏的项目,另一个是使用宏的项目。我试图调试定义宏的项目时相当愚蠢

    因此,文档中给出的说明是正确的,我只需确保在正确的项目中运行它们:当然,很明显

    为了其他人的利益,我发现使用命令行scalac来获得正确的命令行非常有用:编辑命令行和控制我所在的目录要比在eclipse中快得多

    对于想使用Scala宏的人来说,另一件要认识到的事情是,直接运行scalac的错误消息要比eclipse的错误消息好得多。

    几小时的“对书中的每个eclipse选项进行实验”,我已经让它工作了。我会在StackOverflow允许的时候发布一个正确的答案