编写自定义eclipse调试器

时间:2012-06-22 21:21:06

标签: java eclipse debugging eclipse-plugin

编辑:必须有一些方法可以在不编写全新调试器的情况下解决这个问题。我目前正在研究在现有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中开发插件或制作调试器。

谢谢!

3 个答案:

答案 0 :(得分:6)

不是一件容易的事。我认为那篇文章仍然是主要的参考。旧的,但不过时。尝试消化它,并最好使其工作。在此之前,您应该具有开发Eclipse插件的最小经验。

图片中有很多部分,但您必须首先理解的是,当Eclipse正在调试时(假设我们使用的是标准调试模型),我们有两个独立的“世界”:Eclipse端,以及口译员方面(或者,如果您愿意,可以选择“本地”和“偏远”方面)。

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

  • launchConfigurationType ”(plugin.xml中的扩展点),当您单击“Debug As - &gt; New Configuration”时会导致显示新的自定义配置;这样就可以了注意一些“ launchConfigurationTabGroups ”定义,该定义定义将出现在自定义启动配置(eg)中的“选项卡”对话框(每个选项卡通常都有自己的类)。

  • launchConfigurationType通常与 LaunchDelegate 类相关联,该类是您的引导类:它具有创建和启动运行/调试实例的责任,两者都在Eclipse端以及“口译员”(或“远程”)方面。

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

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

  • 正在运行的Eclipse调试器将使用的自定义类的层次结构是非任意的:这些应该具有IDebugTarget作为root,并且应该实现“调试模型”(请参阅​​文章中的figure) )。如上所述,IDebugTarget对象是谁了解如何在EClipse端和远程端之间进行转换(参见this image

答案 1 :(得分:3)

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

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

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

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

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

然后,这应该为您提供正在跟踪的框架中的变量和范围列表...希望无需编写完整的eclipse调试器插件。

答案 2 :(得分:0)

好吧,我将在这里添加第二个答案...我想我对你的环境状态不太熟悉,不知道为什么自定义细节格式化程序不能解决问题。对于大多数情况,我认为他们会为您提供您正在寻找的东西。

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

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

该网站指向项目计划,源存储库,bugzilla问题跟踪数据库(用于错误跟踪和新功能讨论)。也许有些jdt专家可以帮助他们评估最适合你需求的人。