运行一个程序需要添加launch configurable,在自定义launch configuration的时候会指定模式,比如run,debug,profile等等。如果定义的是debug模式,则需要实现debug模型和UI,这样用户就可以在debug下与后台程序互动。Eclipse的debug插件提供以下支持:
·一个通用的debug模型
·debug事件和监听
·断点管理
·表达式管理
debug UI插件则提供了一个用于可视化展示debug模型的框架,同时还提供了一些实用工具类来实现常见的UI任务。
这里将用java调试器的视角来审视平台debug模型和UI类。
参考:http://www.eclipse.org/articles/Article-Debugger/how-to.html
平台debug模型定义了常用的debug接口,用于继承或者实现具体的,特定语言的实现。
工件(Artifacts)
该模型包括各种不同的类以代表debug下的各种工件。所有的工件都必须额外实现IDebugElement,该模型定义了以下工件:
·Debug对象(IDebugTarget) - 一个可debug的执行上下文,比如一个进程或者虚拟机
·表达式(IExpression) - 代码片段,用于给用户观看、评估
·内存块(IMemoryBlock) - 执行上下文里的连续的内存段
·寄存器(IRegister) - 寄存器组里的命名变量
·寄存器组(IRegisterGroup) - 一组标识栈帧的寄存器
·栈帧(IStackFrame) - 一个挂起的线程里的可执行上下文,包含局部变量和参数。
·线程(ITread) - debug对象里的包含栈帧的执行连续流
·值(IValue) - 变量值
·变量(IVariable) - 一个栈帧或值里的可见数据结构
·观察表达式(IWatchExpression) - 由特定上下文提供,会即时更新它的值
实现特定语言调试器的插件通常会扩展这些接口来包含该语言的特性,所有的debug元素可以返回它们所在插件的ID,对于用于注册那些和调试模型有关的类(比如UI类)来说,这是非常重要的。
动作(Actions)
动作是调试工件的常见特性,自然就会有动作模型,其包含的一些定义调试的动作集的接口。debug元素如有需要,可以实现它们。
·断开(IDisconnect) - 提供了结束目标程序的调试事务,并使之继续运行的能力。
·步进(IStep) - 提供了进入,下一步,以及跳出当前执行点的能力
·步进过滤器(IStepFilters) - 该能力用于允许或者屏蔽步进操作的过滤器,这样目标就可以根据需要来过滤步进。
·挂起和恢复(ISuspendResume) - 该能力可以挂起和回复执行过程
·终止(ITerminate) - 该能力用于中止执行上下文
·修改值(IValueModification) - 该能力用于修改变量值
事件(Events)
Debug事件(DebugEvent)用于描述一个程序被调试时发生的事件。
断点允许用于在指定位置挂起程序的执行过程。
如果插件需要在UI里展示断点,开发者可以在IBreakpointManager里添加IBreakpointListener。
断点管理器(IBreakpointManager)是管理所有的断点的中央权威,所有断点都是使用该断点管理器来添加和移除,这又会反过来通知所有监听断点活动的监听者。同样的,断点管理器也可以管理断点的可用不可用状态。断点管理器在DebugPlugin这个全局类里找到,代码如下:
IBreakpointManager mgr= DebugPlugin.getDefault().getBreakpointManager();
定义了自己的debug模型和lannch configuration的插件经常需要定义它们自己的断点类型,这需要实现IBreakpoint接口。
断点的实现要实用资源标记(resource markers)。资源标记可以把资源的相关信息根据name属性关联起来,使用标记来实现断点,debug模型可以利用所有的现有标记功能,如持久化、搜索、在编辑器里搜索、添加或移除标记。
断点标记注册方式:
<extension id="javaBreakpointMarker" point="org.eclipse.core.resources.markers">
<super type="org.eclipse.debug.core.breakpointMarker"/>
</extension>
表达式是一段片段代码,用户观察它,可以对值做出评估。表达式的上下文依赖于特定的debug模型,有些表达式可能需要在程序的特定位置做评估,来决定它的变量是否可以被引用。表达式的接口是IExpression。
表达式管理器(IExpressionManager)保持了所有的workspace里的表达式的轨迹,它也可以发起事件来唤起监听,比如表达式被添加了,移除了,又或者是修改了。
表达式可以用来实现“检查器”或“剪贴簿”,来让用户评估代码片段。
观察表达式(watch expression)用来在程序执行期间做重复多次评价的表达式,其接口是IWatchExpression。当有新的debug上下文提供时,该表达式的值会被更新。观察表达式常用来实现“观察列表”,这是一张用来展示程序执行期间表达式值的改变的表格。
由于Eclipse的debug元素有一个通用的、统一的模型,所以,自定义一个调试器UI是可行的。调试器UI的核心支持在于debug模型展示(IDebugModelPresentation)。它负责提供特定的debug模型的labels、images、和编辑器相关元素。
自定义debug模型的插件通常提供有模型展示,使用org.eclipse.debug.ui.debugModelPresentation扩展点可以完成该功能,该扩展点用于把某个IDebugModfelPersentation的实现与特定的debug模型关联在一起。例子如下:
<extension point = "org.eclipse.debug.ui.debugModelPresentations">
<debugModelPresentation
class = "org.eclipse.jdt.internal.debug.ui.JDIModelPresentation"
id = "org.eclipse.jdt.debug"
detailsViewerConfiguration = "org.eclipse.jdt.internal.debug.ui.display.DetailsViewerConfiguration">
</debugModelPresentation>
</extension>
detailsViewerConfiguration选项可以附加给debug模型展示,它必须实现SourceViewerConfiguration类。"细节(details)"的含义是被debug模型所解释的,这些细节被debug模型展示计算,然后被传递给细节视图。举个例子,java调试器使用细节视图来展示变量视图里的代码辅助当表达式被估值的时候。
实现IDebugModelPresentation的时候可能要同时实现IDebugEditorPresentation。
用于实现debugUI的工具类。
DebugUITools:
·在加载特定加载配置前保存\构建workspace
·存储和检索代表debug UI细节的图片
·查找debug UI展示和debug模型的关联
·debug插件引用存储的检索
·debug时的相关信息,比如当前上下文,进程或者控制台
·出现各种缺省时,打开launch Configuration对话框
·设置step过滤器的可用状态
IDebugView:通常需要继承AbstractDebugView
·在一个Action注册机里存储Action
·底层视图的上下文菜单的通用处理
·删除键和双击功能的通用实现
·在视图里展示错误信息的机制