调试 DSLD 脚本

工程 | Andrew Eisenberg | 2011年8月2日 | ...

不久前,我为 Groovy-Eclipse 引入了 DSL 描述符 (DSLDs)。DSLDs 是 Groovy 脚本,为 Eclipse 工作区中的 Groovy 项目提供丰富的编辑支持(内容辅助、导航等)。由于 DSLDs 只能在运行中的 Eclipse 进程中执行,因此调试不像启动 Eclipse 调试器并逐步执行 Groovy 脚本那么简单。在这篇文章中,我将描述一些可用于调试 DSLD 的简单和更复杂的技术。

要使所有这些工作,您需要最新的开发版本

简单而粗糙

调试 DSLD 最简单粗暴的方法是使用 println。这会将表达式打印到正在运行的 Eclipse 进程的标准输出中,如果您从命令行启动 Eclipse,则可以看到这些输出。但是,我建议使用 log 语句代替。这会将日志信息打印到 Groovy 事件控制台

如下例所示,每次 MethodParams.dsld 中的切入点匹配时,vals 的当前值都会打印到 Groovy 事件控制台。

log 方法可以在 DSLD 脚本中的任何位置使用。事件控制台中的所有日志条目都以“======”为前缀。Groovy 事件控制台还会显示脚本的编译错误和抛出的异常,因此即使 DSLD 脚本不包含任何 log 语句,它也很有用。

不使用事件控制台时,最好将其关闭,因为跟踪会很快变大,并最终消耗大量内存和处理能力。

高级

打印和日志语句的使用是有限的。通过设置断点、单步调试代码和执行调试评估的能力,可以为 DSLD 提供适当的调试支持。尽管设置有点复杂,但在调试复杂脚本时这可能是值得的。本质上,您需要在 Eclipse 调试器中启动一个新的 Eclipse 实例(运行时工作台),并通过它来调试您的脚本。关于 创建 使用 Eclipse 运行时 工作台的信息有很多,但其中大部分对于 DSLD 调试来说并非必需。

以下是所需步骤

  1. 安装 Groovy-Eclipse 源代码(可选,但对于深入了解 DSLD 如何执行很有用)。您可以从 Eclipse 的安装管理器中执行此操作。选择 Groovy-Eclipse SDK。有关更多详细信息,请参阅此处
  2. 创建并启动一个新的空 Eclipse 工作区。您可以通过从命令行启动 Eclipse 并指定新工作区位置的 -data 参数来完成此操作。此工作区是启动第二个工作区(您的 DSLD 实际所在的位置)的主机。
  3. 在新工作区中创建一个新的 groovy 项目,最初为空
  4. 启动运行时工作台。首先打开启动配置对话框: 然后双击Eclipse application创建新的启动配置。在Workspace Location部分,选择包含您的 DSLD 的工作区的文件系统目录:
  5. 运行时工作台启动后,将要调试的 DSLD 从运行时工作区拖放到主机工作区中新建的项目中。执行此操作时,您将看到一个如下所示的对话框: 务必选择link。链接文件将确保在一个工作区中所做的更改会反映在另一个工作区中。我建议拖放(而不是通过其他方式将文件导入到工作区)因为它最容易确保您的文件是链接而不是复制的。
  6. 在主机工作区的 DSLD 中设置一个断点。
  7. 在运行时工作台中执行一些操作来运行您的脚本。也许将鼠标悬停在 DSLD 应用的 Groovy 文件中一个有趣的标识符上。
  8. Eclipse 将在断点处停止
  9. Eclipse 第一次在断点处停止时,源代码不会出现
    您必须明确将新建的 Groovy 项目添加到 Eclipse 运行时启动配置的源代码查找路径中。一旦您这样做,源代码就会可用。
  10. 恭喜!您现在应该能够使用调试器调试您的 DSLD 了。

变量视图将正常工作:

如果您有 STS,您可以在表达式视图中执行评估:

在显示视图中:

在编辑器中,选择一个表达式并执行 CTRL-Shift-I 或 CMD-Shift-I(在本例中为 names

请注意,闭包不允许在评估中使用,并且 Groovy 调试评估必须在 Groovy -> Debugger -> Extended Debugging Support 页面中明确启用

使用此方法调试您的 DSLD 脚本将帮助您创建更大的脚本以支持更复杂的 Groovy DSL。

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,助您加速进步。

了解更多

获得支持

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件,只需一份简单的订阅。

了解更多

即将举行的活动

查看 Spring 社区所有即将举行的活动。

查看所有