编写自定义 eclipse 调试器

2022-09-04 22:25:34

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

谢谢!


答案 1

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

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

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

  • launchConfigurationType”(插件中的扩展点.xml),当您单击“调试为->新配置”时,它会导致新的自定义配置的幻影;这与一些“launchConfigurationTabGroups”定义相辅相成,该定义定义了将出现在自定义启动配置中的“选项卡”对话框(例如)(每个选项卡通常都有自己的类)。

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

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

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

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


答案 2

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

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

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

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

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

然后,这应该为您提供正在跟踪的框架中的变量和作用域列表...希望不必编写整个eclipse调试器插件来执行此操作。