【问题标题】:Writing a custom eclipse debugger编写自定义 Eclipse 调试器
【发布时间】:2012-06-25 05:32:48
【问题描述】:

编辑: 必须有某种方法可以解决这个问题,而无需编写全新的调试器。我目前正在研究在现有 java 调试器之上构建的方法。如果有人对如何获取 Java 调试器已有的信息(关于堆栈帧、变量、原始数据等)有任何想法,那将非常有帮助。

--

我想要做的是我有这个基于 Java 的框架/API,我想编写一个针对我的框架定制的 Eclipse 插件调试器。这是一个简单的例子:

我有两个类,一个叫作用域,一个叫变量。范围包含变量映射。代码全部在 java 中,但我使用这种范围变量关系几乎就像一种新语言,并且想要一个变量调试选项卡,它为我提供当前活动范围的列表以及当前存储在其中的变量。这是一些代码:

import java.util.Hashtable;

public class Scope {
    private Hashtable<String, Variable> variableList = new Hashtable<String, Variable>();

   // constructor 
    public Scope(){

    }

    public void put(String key, Variable v){
        variableList.put(key, v);
    }

    public Variable get(String key){
        return variableList.get(key);
    }


}

public class Variable {

    private String value;
    private String name;

    public Variable(String aName, String aValue){
        name = aName;
        value = aValue;
    }

    public String getValue(){
        return value;
    }

    public String getName(){
        return name;
    }

    public void setValue(String aValue){
        value = aValue;
    }
}

这显然是一个非常简单的例子,但我想完成与此类似的事情,我可以获得一个变量窗口,设置一个断点,并让一个“调试器”列出我的活动范围对象和里面的变量对象.

我一直在努力阅读和理解:http://www.eclipse.org/articles/Article-Debugger/how-to.html

它非常密集(以及非常过时),但我会尝试花一些时间来理解它。我只是想看看是否有人对如何解决此类问题有任何高级建议,因为我在 eclipse 中开发插件或制作调试器的经验很少。

谢谢!

【问题讨论】:

  • 那篇文章是为了增加对新语言的支持。为什么需要修改 Java 类的调试器?您不能使用变量窗口查看当前范围内的对象,然后展开查看内容(如变量列表)吗?
  • 你有什么理由不让你的框架 JSR-233 兼容(java 脚本)?

标签: java eclipse debugging eclipse-plugin


【解决方案1】:

这不是一件容易的事。我认为那篇文章仍然是主要参考资料。旧的,但没有过时。试着消化它,最好让它发挥作用。在此之前,您应该具有开发 Eclipse 插件的最低经验。

图中有很多部分,但首先你必须了解的是,当 Eclipse 调试某些东西时(假设我们使用标准调试模型),我们有两个独立的“世界”:Eclipse 端和解释器端(或者,如果您愿意,“本地”和“远程”端)。

在Eclipse方面,编程涉及到一些Eclipse核心类和你自己的一些类之间的合作,这些类扩展或实现了一些Eclipse类/接口:

  • 一个“launchConfigurationType”(plugin.xml 中的扩展点),当您单击“调试为 -> 新配置”时,它会导致新的自定义配置出现;这一起出现带有一些“launchConfigurationTabGroups”定义,用于定义将出现在您的自定义启动配置中的“选项卡”对话框 (eg)(每个选项卡通常都有自己的类)。

    李>
  • launchConfigurationType 通常与 LaunchDelegate 类相关联,该类是您的引导类:它负责在 Eclipse 端创建和启动运行/调试实例在“解释器”(或“远程”)方面。

  • 在 Eclipse 端,运行/调试实例由 IDebugTarget 对象及其子对象表示(实现由您负责);这是由 LaunchDelegate 创建的,并在启动时“附加”到远程运行的进程。

  • 远程端,即您实际调试的解释器或程序,可以是任何东西:二进制可执行文件、perl 脚本、在某个站点中运行的某些应用程序(可能也是本地 Java 程序;但是,即使在在这种情况下,它可能会在它自己的 JVM 中运行,而不是在调试的 Eclipse JVM 中!)。您的 IDebugTarget 对象必须知道如何与“远程解释器”(例如,通过 TCP)通信并执行典型的调试器任务(放置断点、步进、运行、请求变量等)——但这里的协议取决于您,这完全是任意的。

  • 1234563如上所述,IDebugTarget 对象是理解如何在 EClipse 端和远程端之间进行转换的对象(参见this image)

【讨论】:

  • 所以如果我尝试编写一个基于 Java 的调试器,那么类似于文章中的示例,我的“解释器”(类似于他们的 pda.pl 解释器)是 JVM?这是调试 Java 代码的正常方式吗,例如,他们也使用这种模型,其中有一个远程和一个本地,并且有 2 个 JVM,一个运行调试器,一个运行正在调试的程序?
  • 我不确定您的意图,但总的来说,我会回答是。这就是 Eclipse 本身调试 Java 程序的方式,它启动不同的 JVM 并通过 TCP/IP 与它连接 wiki.eclipse.org/…
【解决方案2】:

在 eclipse edc 调试器上工作过,听起来写一个完整的调试器并不是你想要的。

听起来在运行调试器时,您将可以访问具有您感兴趣的变量和范围的对象。

您可以在类本身中使用 toString() 或使用详细格式化程序来显示所需信息的变体。 toString() 调用可以非常详细并嵌套到调用中,显示整个数组等。详细格式化程序也可以非常复杂。

见http://www.robertwloch.net/2012/01/eclipse-tips-tricks-detail-formatter/。这是几个 URL 中最好的一个(我与作者没有任何关联)。

一旦您对变量和范围对象的输出感到满意,您应该能够添加将始终在您的表达式窗口中显示它们的监视表达式(因此您不必依赖堆栈帧中的局部变量你可能在)。

这应该会为您提供您正在跟踪的框架中的变量和范围列表……希望无需编写整个 Eclipse 调试器插件即可。

【讨论】:

  • 我第二约翰:详细格式化程序确实看起来确实是您正在寻找的东西。它们易于实施和测试,并且应该提供您需要的大部分内容。
【解决方案3】:

好的,我将在此处添加第二个答案……我想我对您的环境状态不够熟悉,无法知道为什么自定义详细信息格式化程序无法解决问题。在大多数情况下,我认为他们会为您提供所需的内容。

但如果您真的有兴趣创建另一个包含这些项目的视图,那么您可以查看eclipse jdt project。它提供的扩展点完全有可能让您访问您想要添加的内部变量和堆栈帧信息,以及一些可以让您的工作更轻松的 UI。

换句话说,你可能不必编写一个全新的调试器插件,但也许是一个可以与 jdt 一起工作的插件。

该站点有指向项目计划、源代码库、bugzilla 问题跟踪数据库(用于错误跟踪和新功能讨论)的指针。也许一些 jdt 专家可以帮助权衡他们对最适合您的需求的意见。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    • 2017-09-22
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多