`
liugang594
  • 浏览: 987521 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Eclipse调试框架的学习与理解一

阅读更多

提供一个可视化的调试器对于调试程序是很有益处的。Eclipse里的java调试器做的已经非常完美了。

只要努力,我们也能得到一个那么完美(理论上)的UI调试器。在Eclipse里,定义了很多针对调试器的扩展点供我们扩展,让我们可以轻松的利用Eclipse已有的机制来实现自己的UI调试器,例如:运行堆栈的显示、变量值的显示、追加和删除断点,以及单步跟踪等等。

但是首先我们需要清楚两件事:

1、Eclipse并没有提供任何针对调试器的默认实现。

2、Eclipse本身并不支持调试,这需要语言工具或引擎的支持。

Eclipse只是提供了一个共通的UI界面来操作和显示结果。这点我们是需要首先清楚。

 

一、运行堆栈的结构

所谓的运行堆栈,可以看下图:

图一

图一

调试Java的时候,我们总是可以看到一个类似于这样的图,其中左边是一个树状结构,选择其中的任一stackFrame(稍后讲)在右边的Variables视图就会看到当前这个stachFrame中所有变量的值。

 

Eclipse里,这个堆栈结构如下:

图二

图二

堆本的最顶层的是Launch对象,最低层的是IValue对象(实际上也不能这么讲,IValue对象与IVariable对象是循环套用的,所以会形成类似于JavaValue的一种树结构)。其中在左边结构里只会显示到IStackFrame这一级,剩下两级在右边的Variables视图里显示。

 

堆栈中的每个对象都应该定义成一个DebugElement对象,也就是实现的时候需要直接或间接的继承这个对象,它定义了一些通用的方法,例如发出事件,取得launch或都是取得模型标识。在后面我们会讲到这些都很有用。

 

怎么得到这个栈

在继续之前,我们先介绍一下这个堆栈是怎么来的。

 

在介绍Launch框架的那篇文章里,我提到过:launch对象可以加两种类型的对象,一个是IDebugTarget对象;另一个是IProcess对象。我也提到了:如果是在“run”模式下,我们选择追加IProcess对象;如果是在“debug”模式下,我们应该追加IDebugTarget对象。

 

一旦我们追加了一个IDebugTarget对象(需要自己继承实现),里面就会有一个getThreads()方法用来返回所有的当前这个target的所有IThread对象;在IThread对象里有一个返回所有这个Thread对象下的StackFrame对象的方法getStackFrames()。以此类推,我们就可以得到一个完整的堆栈。

 

 

怎么显示这个栈 

事实上,我们不用管怎么显示这个栈,只要你在实现类里定义好了那些get**s()方法,那么Eclipse框架会自动调用这些方法,然后得到一棵堆栈树。

我觉得这里的关键是:怎么决定这个树的具体显示内容。我说的这个内容,不是指对于某个结果——结点上的label显示成什么,这个也是很简单的,每个类中都需要实现的一个方法就是:getName()。结点的label值就是显示这个方法的返回值。

 

除此之外,还有一个扩展点可以用来提供树上各类型结点的显示方式,例如图标、文本等等。这个扩展点是:

org.eclipse.debug.ui.debugModelPresentations

 

我想说的是:怎么决定树上有多少个什么样的结点。也就是我们怎么给出每个对象里的get**s()方法,例如上面的getThreads()方法和getStackFrames()方法。我们需要知道的是,这个不是Eclipse能决定的,而是要由你当前的应用和你的后台的解释结果来决定。

二、单步跟踪的支持

我们回到图一,我们看一下我们熟悉(如果你在Eclipse调试过Java)的那些跟踪按钮:

 

图三图三

看红色圈住的部分,有运行、暂停、停止和用来单步调试的单步进入、跳过和跳出。

 

这些扭键缺省已经和键盘绑定了,例如扭F5就是单独进入、F8就是运行到下个断点等等。我们需要给出的就是当前哪些键可用、和可用的时候如何执行。

 

实现上我们的每层的实现类里都会有针对上面每个按钮的方法需要实现,我们以StackFrame层的单步进入为例,需要实现以下两个方法:

public boolean canStepInto() 返回false表示单步不可用;返回true表示单步可用 public void stepInto() throws DebugException 在单步可用的情况下,执行单步命令时调用此方法。通常是发送出一个单步进入命令(后台支持),得到一个返回值。然后根据此返回值来决定余下事项。

 

其实各事件同此类似。实际这里还是一样,需要自己去实现各步的逻辑。

事实上,我们不用管怎么显示这个栈,只要你在实现类里定义好了那些get**s()方法,那么Eclipse框架会自动调用这些方法,然后得到一棵堆栈树。

我觉得这里的关键是:怎么决定这个树的具体显示内容。我说的这个内容,不是指对于某个结果——结点上的label显示成什么,这个也是很简单的,每个类中都需要实现的一个方法就是:getName()。结点的label值就是显示这个方法的返回值。

 

除此之外,还有一个扩展点可以用来提供树上各类型结点的显示方式,例如图标、文本等等。这个扩展点是:

org.eclipse.debug.ui.debugModelPresentations

 

我想说的是:怎么决定树上有多少个什么样的结点。也就是我们怎么给出每个对象里的get**s()方法,例如上面的getThreads()方法和getStackFrames()方法。我们需要知道的是,这个不是Eclipse能决定的,而是要由你当前的应用和你的后台的解释结果来决定。

  • 描述: 图一
  • 大小: 8.9 KB
  • 描述: 图二
  • 大小: 7.8 KB
  • 描述: 图三
  • 大小: 9.6 KB
分享到:
评论
3 楼 zxjlwt 2015-08-10  
学习了。

http://surenpi.com
2 楼 imu2008 2014-05-08  
好文,谢谢分享~楼主好样的
1 楼 luoww1 2013-12-30  
能给个具体的工程嘛?这样看,自己还是不会实现,有点晕乎乎的。。。谢谢。。。

相关推荐

    基于Eclipse的开源框架技术与实战 源代码

    《基于Eclipse的开源框架技术与实战》源代码是一份涵盖了多章节的编程学习资源,主要针对使用Eclipse集成开发环境进行开源框架的应用和技术实践。由于文件量较大,该资源被分成了三个部分进行上传,其中包括了从第2...

    js eclipse 调试插件.

    总的来说,JavaScript Eclipse调试插件是提高JavaScript开发效率和质量的关键工具,通过它,开发者可以更好地理解代码运行状态,快速定位和解决问题,从而提升开发工作的专业性和生产力。对于任何使用Eclipse进行...

    Eclipse插件开发学习笔记.pdf

    Eclipse插件开发是一个涉及多方面知识的复杂过程,开发者需要掌握Eclipse平台架构、插件开发工具PDE的使用、工作台的扩展、服务层的交互、命令框架的设计、帮助系统的集成、国际化和本地化处理、测试和调试等诸多...

    Eclipse插件开发学习笔记全篇+源码.rar

    本文将深入探讨Eclipse插件开发的相关知识点,结合提供的"全书分为4篇共24章"的学习笔记和源码,帮助你更全面地理解和实践Eclipse插件开发。 第一篇:基础篇 在这一篇中,你将学习到Eclipse插件开发的基础知识,...

    eclipse 环境搭建(ssh2框架)

    在本文中,我们将深入探讨如何使用Eclipse IDE搭建一个基于SSH2框架的开发环境。SSH2,即Struts2、Spring和Hibernate的组合,是一种流行的Java Web应用开发框架,能够帮助开发者快速构建高效、可维护的系统。我们将...

    CAS-server Eclipse调试运行源代码

    CAS(Central Authentication Service)是基于Java的一个开源身份验证框架,主要用于实现单点登录(Single Sign-On,简称SSO)。在本文中,我们将深入探讨如何在Eclipse环境中调试和运行CAS-server的源代码,以便...

    eclipse搭建SSH框架详解

    - 导入JDK的src.zip包可以帮助我们更好地理解和调试代码。 #### 第二步:创建项目并配置 1. **创建Web项目**: - 打开Eclipse,创建一个新的Web项目(File -> New -> Dynamic Web Project),并为其命名。 2. *...

    Android的应用程序框架与Eclipse开发应用程序入门

    《Android的应用程序框架与Eclipse开发应用程序入门》一书,为初学者提供了全面的指导,尤其适合在校大学生和想要涉足Android应用开发的程序员。本文将深入解析Android应用程序的基础框架,并以HelloActivity为例...

    Eclipse跟踪调试Android源代码

    本文将详细介绍如何使用Eclipse来跟踪和调试Android源代码,包括应用层和框架层,这对于提升开发效率和解决复杂问题至关重要。 1. **导入Android源码到Eclipse** - 首先,你需要获取Android源码,通常可以从...

    [Eclipse插件开发学习笔记].张鹏等.扫描版-1

    【Eclipse插件开发学习笔记】是一本详细探讨Eclipse插件开发的教程,由张鹏等人编写。这本书深入浅出地介绍了如何利用Eclipse平台进行插件开发,旨在帮助开发者提升在Eclipse环境中定制和扩展功能的能力。通过阅读...

    eclipse的ssm框架例子

    总结,"eclipse的ssm框架例子"是一个实用的学习资源,它涵盖了从项目结构配置到具体功能实现的全过程,对于初学者或者希望深入理解SSM集成的开发者来说,是非常有价值的参考资料。通过实际操作这个例子,不仅可以...

    SSH 框架的小例子eclipse

    SSH框架,全称为Struts2、Spring和Hibernate的组合,是Java开发中广泛...通过这个小例子,你可以深入理解SSH框架的整合方式,学习如何在Eclipse中搭建、运行和调试SSH应用,这将为你的Java Web开发能力打下坚实基础。

    Caffe使用Eclipse调试1

    在深度学习领域,Caffe是一种广泛使用的开源框架,主要用于构建和训练神经网络模型。这篇教程主要介绍了如何在Eclipse环境中配置Caffe项目,以便进行调试和开发。以下是一些关键步骤和涉及的知识点: 1. **环境准备...

    eclipse调试hadoop2.x必备

    在IT行业中,Hadoop是一个广泛使用的开源框架,用于处理和存储海量数据。Eclipse则是一款强大的集成开发环境(IDE),支持多种编程语言,包括Java,是编写和调试Hadoop应用程序的首选工具。当我们需要在Windows 7...

    EclipseEE struts Tomcat入门程序调试.rar

    通过以上步骤,你将在Eclipse EE环境中成功创建并调试了一个基本的Struts1应用程序。这只是一个起点,实际开发中,你可能需要集成数据库、处理业务逻辑、实现安全性等更复杂的功能。不断学习和实践,你将更加熟练地...

    Eclipse调试器和Debug视图

    ### Eclipse调试器和Debug视图知识点详解 #### 一、Eclipse SDK与内置Java调试器 **Eclipse SDK**(Software Development Kit)是专为Java开发设计的一个强大平台,其中包括了JDT(Java Development Tools)组件,...

    Eclipse搭建SSH框架开发学习笔记

    本教程将围绕使用Eclipse IDE来搭建SSH框架进行详细讲解,以帮助初学者更好地理解和掌握这一技术栈。 首先,我们来了解SSH框架的基本概念: 1. **Struts**:这是一个基于MVC(Model-View-Controller)设计模式的...

    一个良好的验证框架,导入到eclipse里就可以运行

    1. **创建项目**:在Eclipse中新建一个Java或Web项目,根据框架的性质选择合适的项目类型。 2. **导入依赖**:将验证框架的库文件(通常为JAR或NPM包)添加到项目的类路径或依赖管理中。如果是Maven或Gradle项目,...

    完全正确的eclipse安装+调试

    接下来是插件的安装,这里以“Easy Struts for Eclipse”为例,这是一个用于简化Struts框架开发的插件。在Eclipse中,可以通过“Help” > “Eclipse Marketplace”来搜索并安装插件。输入“Easy Struts”,找到插件...

    Eclipse SSH框架下的增删改查

    这个项目不仅涵盖了SSH框架的基础使用,还涉及到了数据库设计、前端展示、事务管理和错误处理等多个方面,对于初学者来说,是一个很好的学习和实践平台。通过实际操作,你可以更深入地理解SSH框架的工作原理,提升...

Global site tag (gtag.js) - Google Analytics