eclipse怎么画内存图示

eclipse怎么画内存图示,第1张

前言

内存视图是由Eclipse调试框架提供,用来检查程序内存的。它是一个灵活的视图,允许调试扩展者自定义内存监视器的展示方式来满足他们的用户需求。你可以使用SWT的控件来展示内存监视器。

内存视图在开发之初,一个目标就是支持不同人的不同需求和模型。它需要能够支持从在大型机上工作的开发人员到小型嵌入式设备上的开发者的需求。这么大范围的群体的需求千差万别。当在一个平台上使用某种特定的、可能对用户有意义的内存展示方式来表示内存时,在另一个平台可能对用户来说完全是混乱不堪的。

上面的问题的解决办法就是,提供一个视图和一个框架,允许调试扩展者来定义自己的内存监视器展示方式。这篇文章就要讨论这个框架,演示如何在调试器中添加内存视图支持。

图1 内存视图

图1是内存视图,它由三窗格组成。左边的窗格叫做监视器(Monitors)窗格,列出了被当前调试会话监视的所有的内存监视器。右边的两个窗格叫做渲染结果(Renderings)窗格。它们显示的是从第一个监视窗格中选中的内存监视器的监视结果。一个内存渲染器就是一个内存监视器的用户展示,它使用一种展示的格式来展示内存监视的内容。在图1中,内存视图显示了内存监视器“&str”的两个渲染效果。十六进制渲染使用传统的表格格式显示,十六进制树渲染使用树的格式显示。

做为一个调试扩展者,可以通过两种方法来扩展内存视图:

重用调试平台提供的内存渲染器

调试平台提供了可重用的四个表格渲染器集合:十六进制、ASCII、有符号整形和无符号整形。你可以在你的调试器中很简单地添加内存监视器,重用这些渲染器。这些渲染器支持自定制。图1中十六进制渲染器就是调试平台提供的一个表格渲染器。

创建自定义的内存渲染器

这个方式需要更多的工作,但是可以控制内存监视器对用户的展示。另外,你可以在调试器中定义新的内存渲染器类型来提供内存监视支持,然后使用自定义的渲染器类型来展示内存监视器。图1中的十六进制树就是一个自定义的渲染器类型。

这篇文章教你怎样在调试器中添加内存监视支持。同时,也会解释怎样重用调试平台提供的表格渲染器。另外,这篇文章将会讨论在表格渲染器中的可用定制点。

运行实例

这篇文章附带了一个简单的实例,用来帮助学习怎么添加一个内存监视器支持到调试器中。这个例子由一个启动配置、调试模型对象、调试引擎组成。

运行这个例子:

1、 将例子解压到eclipse plugin目录

2、 重启工作区、重建一个“Debug Nothing”的启动配置

3、点击“Debug”

启动以后,内存视图会自动打开,“Add Memory Monitor”按钮变为可用。点击然后输入任一表达式,调试器就会模拟计算表达式为一个地址,然后你可以添加一个内存渲染器到视图中。

内存视图框架

为了能够添加内存监视器到你的调试器中,你需要对内存视图框架有一个基本的了解。图2是内存视图框架。

图2 内存视图框架

内存块Memory Block

一个内存块代表调试器中分配的一块内存。它是一个调试模型对象,扩展IMemoryBlock或者IMemoryBlockExtension。在后面的章节我们会讨论IMemoryBlock与IMemoryBlockExtension的不同。

内存块管理器Memory Block Manager

内存块管理器管理工作台中的所有内存块。你可以使用内存块管理器查询当前显示的内存块。另外,当一个新的内存块被添加或删除时,管理器会广播添加删除事件。你可能向内存块管理器注册一个监听,用来接收这些事件的通知。

内存视图

内存视图是一个内存渲染位置。内存渲染地址中存放了工作台拥有的内存渲染器。内存视图同时提供了一个同步服务,使得同一个内存渲染地址中的渲染器可以交互。

内存渲染类型

一个内存渲染类型表示一种内存渲染方式。它是通过plugin.xml提供的。一个内存渲染类型指定一个渲染类型代理,代理的作用就是在内存视图中创建一个内存渲染器。内存渲染类型不会绑定到某个调试模型上,它是在工作台全局定义的。重用一个已经存在的渲染类型,模型必须创建一个内存渲染绑定来将渲染类型绑定到模型上。

内存渲染绑定

定义对一个调试模型起作用的内存渲染类型。可以通过plugin.xml配置。

内存渲染管理器

管理工作台中所有的渲染类型和渲染绑定。

为了使用内存视图,你的调试器必须能够创建并返回一个内存块。内存块用来从调试引擎/系统中获取内存。另外,你的调试器必须定义你所需要的内存渲染绑定。下面的章节将会解释怎样向你的调试器中添加内存块,也会讲到如何定义内存渲染绑定和重用调试平台提供的内存渲染器。

向调试器添加内存监视器

你的调试模型需要扩展两个关键的接口:

1.调试目标必须扩展IMemoryBlockRetrieval或者IMemoryBlockRetrivalExtension。IMemoryBlockRetrieval和它的扩展,能够在需要的时候向调试目标查询内存块。

2.调试模型必须扩展IMemoryBlock或者它的扩展IMemoryBlockExtension。它们代表了调试器中的内存监视。在用户需要查询内存时,通过这个接口与调试模型进行交互。

扩展IMemoryBlockRetrieval

一般由调试目标扩展这个接口。扩展的两个方法:

IMemoryBlockRetrieval:

public boolean supportsStorageRetrieval()

public IMemoryBlock getMemoryBlock(long startAddress, long length) throws DebugException

supportsStorageRetrieval()方法允许用户查询调试目标是否支持内存块查看。如果返回true,”Add Memory Moditor”的按钮会变为可用,否则,将一直不可用。

getMemoryBlock()方法允许用户从调试目标中请求一个内存块。调用,调试目标会创建并返回一个内存块,这个内存块就是你所给的起始地址加上长度。如果创建出现问题,调试目标需要通过抛出DebugException报告一个错误。

IMemoryBlock和IMemoryBlockRetrieval允许用户创建具有基本功能的简单内存监视器。比如,扩展IMemoryBlock,将限制用户只能查看固定范围的内存,用户不能查看超过范围(起始地址加长度)的内存块。

为了提供更多的高级功能给用户,调试模型必须扩展IMemoryBlockRetrievalExtension和与它对应的IMemoryBlockExtension。IMemoryBlockRetrievalExtension要求调试模型扩展额外的方法:

IMemoryBlockRetrievalExtension:

public IMemoryBlockExtension getExtendedMemoryBlock(String expression, Object context)throws DebugException

当请求一个内存块时,用户通过IMemoryBlockRetrievalExtension来向调试目标请求IMemoryBlockExtension。调用时,getExtendedMemoryBlock()方法将给定的表达式转化为一个地址,然后返回一个IMemoryBlockExtension。如果这个过程出错,调试目标需要通过抛出DebugException报告一个错误。

SmapleDebugTarget示例扩展了IMemoryBlockRetrievalExtension:

public IMemoryBlockExtension getExtendedMemoryBlock(String expression,Object context) throws DebugException {

// ask debug engine for anaddress

BigIntegeraddress = getEngine().evaluateExpression(expression, context)

// if address can beevaluated to an address, create memory block

if (address != null)

{

IMemoryBlockExtensionmemoryBlock = newSampleMemoryBlock(this, expression, address)

fMemoryBlocks.add(memoryBlock)

returnmemoryBlock

}

// otherwise throw debugexception

IStatus status = newStatus(IStatus.ERROR, "example.debug.memoryview", 0, "Expressioncannot be evaluated to an address", null)

DebugException exception =new DebugException(status)

throw exception

}

当请求一个内存块时,调试目标将请求发送给调试引擎来计算地址,如果地址计算成功,返回一个SampleMemoryBlock,它扩展了IMemoryBlockExtension。如果失败则抛出异常。

IMemoryBlockRetrievalExtension和IMemoryBlockRetrieval选择

IMemoryBlockRetrieval和IMemoryBlock在eclipse2.0创建,是一套允许调试目标创建一个给定地址的简单内存块的简单API,内存块结果是固定的,而且只允许调用者从整个内存块中查看内存。当一个IMemoryBlock在渲染器中显示时,用户不能查看超出范围的内存块。因为扩展这些接口只需要很少的方法,所以使用起来比较简单。

IMemoryBlockRetrievalExtension和IMemoryBlockExtension在eclipse3.1中引入。它提供了丰富的方法集来允许用户获取目标系统的更多信息。由于IMemoryBlockRetrievalExtension能够根据一个表达式或者调试上下文创建内存块,所以在创建一个内存监视器时不会被强制输入一个地址。另外,内存块结果(一个IMemoryBlockExtension)是动态的,允许调用者从任意地址查看内存。允许在表格渲染器中动态使用滚动条,允许用户在系统的任意可用地址查看内存。

下表总结了IMemoryBlockRetrievalExtension和IMemoryBlockRetrieval的区别:

IMemoryBlockRetrieval

IMemoryBlockRetrievalExtension

Creates IMemoryBlock , a basic static memory block. Does not offer as much functionality, but easier to implement.

Creates IMemoryBlockExtension ,provides much more functionality. More difficult to implement.

User must enter an address and length to create a memory monitor.

User can enter an arbitrary expression when creating a memory monitor (e.g. variable name).

Content of the resulting memory monitor must be retrieved as a whole and dynamic scrolling is not allowed.

Resulting memory monitor can retrieve memory from any valid location, which enables dynamic scrolling in table renderings

嗯。。。几个问题我先说一下:

1.首先大型机和微机,对于使用者来说,没什么区别。

2.putty是一个远程管理的一个登陆软件,使用telnet或者ssh协议登陆,他是为管理服务器的管理人员而设置的,不是用来传输文本的。

3.你题目所说的,只是想使用它上面的软件或者文档。那你可以通过文本传输软件,比如ftp软件,登陆上去,然后把你想要的文件下载到本地。

4.如果你服务端没有开ftp服务,那你可以利用你那putty软件登陆上去,安装(如果没有)和开启ftp服务。(当然,前提是你在服务器里,有足够的权限安装软件)


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11915109.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-19
下一篇2023-05-19

发表评论

登录后才能评论

评论列表(0条)

    保存