Eclipse 建模级调试

Eclipse 建模级调试,eclipse,debugging,eclipse-plugin,emf,eclipse-jdt,Eclipse,Debugging,Eclipse Plugin,Emf,Eclipse Jdt,背景: 最近,我一直在使用一个名为的插件,它与EclipseMF一起工作,并从模型生成Java代码,就像EMF一样,但有一些附加功能。软件的静态结构通过UML类图进行建模,其中动态行为(即方法)通过所谓的Story Drvien建模(SDM)进行建模,该建模类似于活动图,但每个节点都包含代码块(实际上,它们包含模仿特定行为的图形转换,但这些转换会转换为生成的代码块) 我想要开发的是一个调试器,它表示在建模级别上的调试,即不同于标准的eclipse jdt调试器,调试器在某个点停止,然后当我们按

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

我想要开发的是一个调试器,它表示在建模级别上的调试,即不同于标准的eclipse jdt调试器,调试器在某个点停止,然后当我们按Stepover时,它会逐行进行。在我的例子中,我想在SDM的不同节点上放置断点,并假设y调试器在一个特定的节点停止,然后当我按步移时,它应该跳到下一个节点,如果我要按步进,它应该进入该特定的节点

伪例子

问题?

我解决这个问题的方法是让eMoflon注入特定的代码片段(比如say//Stop语句)在生成的Java代码中。当代码中遇到//Stop语句时,我与JDT一起工作的调试器插件应该能够暂停Java的执行。现在我已经根据的指导原则实现了一个调试器,但我似乎找不到与JDT通信的方法。这可能吗我在努力做什么

有人告诉我java代码挂起只能通过JDT/Debug完成,如果是这样,那么我可以用标准JDT/Debug复制上述行为,或者用我的插件扩展JDT/Debug功能吗?

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

接下来,您可能应该看看中的各种抽象,其中许多是来自平台/调试的类型的专门化(例如,
IJavaDebugTarget
->
IDebugTarget
IJavaThread
IJavaValue
->
IValue
)。例如,您可以从
IJavaObject
获取其类型,该类型应为
IJavaClassType

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

  • 从当前调试目标获取启动的
    ILaunchConfiguration
  • 从启动配置中检索
  • 使用普通的Eclipse机制检索
    IProject
    ,然后检索
    IJavaProject
如果您有一个
IJavaClassType
和一个
IJavaProject
,您还可以检索调试器中看到的元素的JDT/Core表示

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

  • 我是否希望在读取生成的Java类后以编程方式创建断点
  • 我是否要生成(虚拟)调用,以调用预先创建断点的特定已知方法
  • 当调试器遇到断点时,如何确定与当前执行相对应的模型元素
您可能会从上的演示幻灯片中得到进一步的启发。这些幻灯片附带一个git存储库,演示了我在实现该调试器时所采取的步骤。您将发现相似之处(我使用状态图/FSM作为示例——我也使用EMF作为模型等)和不同之处(我的示例语言是文本语言而不是图形语言——我对状态图的执行方法是解释而不是代码生成)

在该演示文稿中,您还将发现,现有API和扩展点很好地支持调试器的许多修改,而对于某些任务,我无法找到所需的扩展性。对于后面的任务,我使用它来简化“不可能的”任务