【问题标题】:Debugging on Modeling Level建模级别的调试
【发布时间】:2015-10-29 12:53:09
【问题描述】:

背景: 最近我一直在使用一个名为 eMoflon 的插件,它与 eclipse EMF 一起使用,并像 EMF 一样从模型生成 Java 代码,但具有一些附加功能。软件的静态结构是在 UML 类图的帮助下建模的,其中动态行为(即方法)是用所谓的 Story Drvien 建模(SDM)建模的,它有点类似于活动图,但每个节点都包含块代码(实际上它们包含图形转换以模仿特定行为,但这些转换会转化为生成的代码块)。

我想要开发的是一个 Debugger,它代表了建模级别的调试,即与标准 eclipse jdt 调试器不同,其中调试器在一个断点处停止,然后当我们按下 Stepover 时,它会逐行进行。在我的情况下,我想在我的 SDM 的不同 Nodes 上放置断点,并假设当我的调试器停止在特定 node 时,然后当我按下 Stepover >,它应该跳转到下一个Node,如果我按下StepIn,那么它应该进入那个特定的Node

伪示例

问题?

我解决这个问题的方法是让 eMoflon 在生成的 Java 代码中注入特定的 sn-ps 代码(比如说 //Stop 语句)。当代码中遇到 //Stop 语句时,我的调试器插件与 JDT 一起工作应该能够暂停 java 的执行。现在我已经在Platform Debug Model 的指导方针上实现了一个调试器,但我似乎无法为我的插件找到与 JDT 通信的方法。这甚至可能是我想要做的吗?

有人告诉我,java 代码暂停只能通过 JDT/Debug 完成,如果是这种情况,我可以使用标准 JDT/Debug 复制上述行为或使用我的插件扩展 JDT/Debug 功能吗?

【问题讨论】:

    标签: eclipse debugging eclipse-plugin emf eclipse-jdt


    【解决方案1】:

    如果您已经使用过诸如断点侦听器之类的东西,那么升级到 JDT/Debug 应该不会太难。一个入口点是 JDIDebugModel 类,它允许您创建 Java 断点,或者添加一个 IJavaBreakpointListener,它可以让您很好地控制命中 Java 断点时应该发生的情况。

    接下来您可能应该看看package org.eclipse.jdt.debug.core 中的各种抽象,其中许多是Platform/Debug 类型的特化(例如,IJavaDebugTarget -> IDebugTargetIJavaThread -> IThreadIJavaValue -> IValue)。例如,您可以从IJavaObject 获取其类型,该类型应为IJavaClassType

    重要的是要理解所有这些抽象都代表目标 JVM 中的元素,调试器通过JDWP 与之对话(参见 JDT/Debug 中许多实现类中的“JDI”名称前缀)。因此,上述概念与 JDT/Core 中的概念没有直接联系,但您可以使用以下桥梁从 JDT/Debug 转到 JDT/Core:

    • 从当前调试目标获取启动的ILaunchConfiguration
    • 从启动配置中检索project name
    • 使用普通的 Eclipse 机制检索IProject,然后检索IJavaProject

    如果您有 IJavaClassTypeIJavaProject,您还可以检索在调试器中看到的元素的 JDT/Core 表示形式。

    以上仅解释了 JDT/Debug 的一些功能以及这与 Platform/Debug 和 JDT/Core 的关系。它没有提供实现调试器的完整策略,因此您仍然需要问自己以下问题:

    • 我想在读取生成的 Java 类后以编程方式创建断点吗?
    • 我是否要对预先在其上创建断点的特定知名方法生成(虚拟)调用?
    • 当调试器遇到断点时,如何确定当前执行对应的模型元素?

    您可能会从我在debuggers for interpreted DSLs 上的演示幻灯片中获得更多灵感。这些幻灯片附有一个 git 存储库,展示了我在实现该调试器时所采取的步骤。您会发现相似之处(我使用状态图/FSM 作为示例——我也将 EMF 用于模型等)和差异(我的示例语言是文本而不是图形——我对状态图的执行方法是解释而不是代码生成)。

    在该演示文稿中,您还会发现现有 API 和扩展点很好地支持调试器的许多改编,而对于某些任务,我找不到所需的可扩展性。对于后面的任务,我使用Object Teams,让“不可能”变得简单。

    【讨论】:

      猜你喜欢
      • 2016-12-12
      • 1970-01-01
      • 2017-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-13
      • 2012-07-29
      • 2023-03-10
      相关资源
      最近更新 更多