如何使用Eclipse调试Scala宏

时间:2013-05-06 09:08:09

标签: scala scala-macros

我正在尝试使用Eclipse IDE在失败的Scala Macro实现中设置断点

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

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

但我需要能够调试宏。我使用Eclipse(20110615-0604)和Scala(2.10.1)。我下载了scala-compiler-2.10.1.jar,http://www.warski.org/blog/2012/12/starting-with-scala-macros-a-short-tutorial/的代码现在可以正常工作了。我也写了几个简单的宏。宏是在一个日食项目" ScalaMacro"并且使用它们的代码在一个单独的项目中" HelloScalaMacro"

我现在想调试它们

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

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

我已经做了通常的事情:google搜索Eclipse / Scala宏/ Debug / Breakpoint,读取scala-macro标记中的所有stackoverflow问题,并且在我能找到的每个eclipse设置中玩了很多。 / p>

所以,如果你们中的任何一个知道如何设置断点,你能不能让我知道:它是eclipse版本/ scala版本/ ......问题吗?

2 个答案:

答案 0 :(得分:2)

我自己没有尝试过,原则上它很可能(或更有可能)失败,就像你已经尝试过的那样,但如果成功,它对你来说会更方便。

要尝试此操作,您应该安装Scala-IDE以及源功能。确保您正在使用Eclipse安装,这是Eclipse经典"," Eclipse for RCP Developers",或者您自己提出的类似混合物。

您还需要安装Equinox Weaving Launcher插件,这将允许您使用Equinox Weaving"创建一个" Eclipse应用程序。发射器。

现在:

  1. 创建新工作区
  2. 创建Scala项目
  3. 在该项目中植入宏代码
  4. 在宏源中添加断点
  5. 准备调试:

    1. 使用Equinox Weaving创建一个新的" Eclipse应用程序"调试启动配置。给出一个比#34; New_configuration"更优雅的名字。

      • 在" location"下,将其指向新的不同的工作区目录
      • 在"配置"选项卡,提供类似" -Xmx1536m"
      • 默认情况下,正在运行的Eclipse实例可用的所有插件都应该可用于即将启动的实例。 Eclipse可能需要一些哄骗才能在类路径中包含一个非插件项目 - 如果这不起作用,那就是我试图看到的第一件事。
    2. 您现在需要启动调试配置。

      • 根据您的Scala-IDE版本,您可能会遇到一个"可用的多个启动器 - 选择一个..."警告。我选择了Equinox Weaving Eclipse Eclipse Application Launcher"。
    3. 进入正在调试的Eclipse实例后:

      1. 创建要使用宏的项目
      2. 确保添加对二进制输出的依赖
      3. 将宏的一个小用法示例添加到正在调试的工作区中的项目中。
      4. 用手指交叉
      5. 构建
      6. 理论上,启动Eclipse实例现在将暂停正在调试断点的实例。

答案 1 :(得分:2)

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

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

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

为了其他人的利益,我发现使用命令行scalac来使命令行正确是非常有用的:更快地编辑它,并控制我所在的目录,然后在eclipse中

对于想要使用Scala Macros的人来说,另一件事就是直接运行scalac的错误消息比来自eclipse的错误信息要好得多。

相关问题