编写自定义 Eclipse 调试器

2024-06-19

EDIT:一定有某种方法可以解决这个问题,而无需编写全新的调试器。我目前正在研究在现有 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 http://www.eclipse.org/articles/Article-Debugger/how-to.html

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

Thanks!


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

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

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

  • A "启动配置类型”(plugin.xml 中的扩展点),当您单击“调试为 -> 新配置”时,会出现新的自定义配置;这与一些“启动配置选项卡组”定义,定义将出现在自定义启动配置中的“选项卡”对话框(eg http://www.stlinux.com/sites/default/files/attach_debugger_to_userspace_apptn.png)(每个选项卡通常都有自己的类)。

  • launchConfigurationType 通常与启动委托类,它是一种引导类:它负责在 Eclipse 端和“解释器”(或“远程”)端创建和启动正在运行/调试的实例。

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

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

  • 运行的 Eclipse 调试器将使用的自定义类的层次结构不是任意的:这些类应该有一个 IDebugTarget 作为根,并且应该实现“调试模型”(请参阅figure http://www.eclipse.org/articles/Article-Debugger/images/debug_model.gif在文章中)。如上所述,IDebugTarget 对象了解如何在 EClipse 端和远程端之间进行转换(请参阅这个图片 http://www.eclipse.org/articles/Article-Debugger/images/get_variable_value.gif)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编写自定义 Eclipse 调试器 的相关文章

随机推荐

  • PHP MySql 百分比

    我的问题是关于百分比 我不是专家 所以我会尽力以更好的方式进行解释 我的 mysql 服务器中有一个表 假设有 700 条记录 如下所示 Name country language Birth Lucy UK EN 1980 Mari Ca
  • Dynamics Crm:获取状态代码/状态代码映射的元数据

    在 Dynamics CRM 2011 中 在事件实体上 状态原因 选项集 也称为状态代码 与 状态 选项集 也称为状态代码 相关 例如看这个截图 当我使用 API 检索状态原因选项集时 如下所示 RetrieveAttributeRequ
  • py2exe ImportError:没有名为 的模块

    我已经实现了一个名为 myUtils 的包 它由文件夹 myUtils 文件 组成 init py 和许多名称为 myUtils 的 py 文件 该包包含在 myOtherProject py 中 当我从 Eclipse 运行它们时可以找到
  • 如何正确创建迦太基 cartfile?

    我正在研究购物车文件 迫不及待地想 简单地创建一个购物车文件 就像所有说明所说的那样 只是 如何 简单地 创建一个 Cartfile 我创建了一个纯文本文档 将其命名为 cartfile 并在其中复制了一些依赖项 Ran carthage
  • C++ 标准中短语“构造函数没有名称”的含义

    在尝试理解 C 标准中的 构造函数没有名称 这句话时 我似乎在 clang 中发现了一个错误 有人可以证实这一点吗 VS2015 and gcc rejects this code and I think they it are is co
  • 如何设置旋转元素背面的样式?

    我有一个figure它是可旋转的 通过用户输入任意角度 该旋转明显地使用transition财产 当该元件旋转超过 90 度 90 度时 元件的背面可见 我想对元素的通常隐藏的一面进行与正面不同的设计 但我不确定如何实现这一点 figure
  • 如何在 Swift 中将文件名与文件扩展名分开?

    给定包中文件的名称 我想将该文件加载到我的 Swift 应用程序中 所以我需要使用这个方法 let soundURL NSBundle mainBundle URLForResource fname withExtension ext 无论
  • Swift 运行时库与 Swift 标准库

    In this 关于如何使用 CocoaPods 的教程 https www raywenderlich com 97014 use cocoapods with swift我无法理解以下段落 与 Objective C 不同 标准 Swi
  • 对范围值进行排序

    我想对表示数值范围的字符串数组进行排序 如下所示 b 0 5 100 250 5 25 50 100 250 500 25 50 使用sort我得到的方法 b sort gt 0 5 100 250 25 50 250 500 5 25 5
  • Rails 中的助手 - 构建 html 字符串时的最佳方法是什么?

    我通常这样写助手 def bloco vazio texto btn args titulo content tag h3 Vazio p content tag p texto content tag div titulo tag hr
  • ProcessPoolExecutor 传递多个参数

    ESPN播放器免费 class ESPNPlayerFree def init self player id match id match id team 团队名单1 277906 cA2i150s81HI3qbq1fzi za1Oq5CG
  • 数字和小数的输入掩码

    在测试我的程序后 我发现了以下错误 我在 sqlserver 中的表包含 价格数字 6 2 我的程序的用户输入价格 555 00 就很好了 但是当他输入 555555 时 这是错误的 所以我需要指定掩码 其中尾数是可选的 0 到 999 小
  • 对象克隆库的 Flash 复制?

    这可能是一个非常简单的问题 我只是不知道如何解决 我有一个想要复制的对象 但不知道如何进行 这是我的尝试 var myObj new ObjectClass var duplicate myObj duplicate null myObj
  • JMockit - 初始化问题

    当我使用以下测试时 我收到警告 警告 JMockit 是按需初始化的 这可能会导致某些测试失败 请检查文档以获取更好的初始化方法 这是我的测试实现 package test import static mockit Mockit impor
  • 闭包存储属性初始化有什么好处?

    初始化类的属性时 此代码有什么区别以及优点 缺点 1 let menuBar MenuBar let mb MenuBar return mb and 2 let menuBar MenuBar 两个代码片段都声明并初始化存储的属性 htt
  • Chrome 驱动程序和 Chromium 二进制文件无法在 aws lambda 上运行

    我陷入了一个问题 我需要在 AWS lambda 上做一些抓取工作 所以我按照下面提到的博客及其代码库作为起点 这非常有帮助 并且在运行时环境 Python 3 6 的 AWS lambda 上对我来说工作得很好 https manivan
  • 如何从spark中的hbase表中获取所有数据

    我在 hbase 中有一个大表 名称为 UserAction 它具有三个列族 歌曲 专辑 歌手 我需要从 歌曲 列族中获取所有数据作为 JavaRDD 对象 我尝试了这段代码 但效率不高 有更好的解决方案来做到这一点吗 static Spa
  • 如何在 *nix 中登录时运行脚本?

    我知道我曾经知道如何做到这一点 但是 如何在 unix 中登录时运行脚本 bash 可以 From 维基百科 Bash http en wikipedia org wiki Bash 28Unix shell 29 当 Bash 启动时 它
  • openApi schema 中不区分大小写的字符串参数

    我有一个开放的 API 规范 其参数如下 name platform in query description Platform of the application required true schema type string enu
  • 编写自定义 Eclipse 调试器

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