Debug Framework>>.
关键词 Launching(运行器)/debug/breakpoint(断点)
一,基本debug
1.Launching
Eclipse可以通过IDE在开发过程中运行和debug代码,并且可以扩展.
1>launching 是一个十分便利的工具 包括:
.运行可执行程序
.使用JVM运行一个程序
.线程绑定到一个存在的server上
.在Eclipse JVM中运行一个程序
.使用debug平台运行任何一个注册到launch上的类
2>特别提供一些便利的功能:
.产生一个 O/S 线程
.当程序运行时产生连续信息
.一个用于运行参数可编辑的框架
.一个运行实体和他们的I/O的相互交互的VIEW
.一个可扩展的运行模式(如:run, debug, profile…)
.选择敏感动作来运行
.事件分派
3>运行器配置窗口
.Launch Configuration – 关于如何运行的描述
.Tab Group – 一系列运行配置的tabs
.Mode – 使用那种模式运行(run, debug, profile…)
4>运行器运行窗口
.Launch Object – 运行线程和debug目标容器
.Process – O/S线程的抽象
.Debug Target – 可debug的线程抽象
5>运行器的右键菜单
.Launch Delegate – 执行运行器
.Launch Shortcut – 用于选择运行器的actions
注意:
.运行配置状态和运行器委派行为是独立的,并且可以提升装载插件的lazy性.
.debug平台提供一个可执行运行配置面板,无论他们是否被运行器装载,它们都可以在workbench中装载和他们的运行配置并且需要运行动作
6>运行模型
2. the debug model
1> 什么是debug运行器
2>debug 模型
3>debug 事件
(1)一个debug是描述了在debug过程出现错误或者是一个线程中的事件. 用户接口需要实现和产生debug事件的模型和线程
并且要通过org.eclipse.debug.core.DebugEvent指明. 例如:
.IProcess – 创建, 中止
.IDebugTarget – 创建, 中止, 悬挂, 重新开始
.IThread – 创建, 中止, 悬挂, 重新开始
(2) 悬挂, 重新开始 有详细的代码:
.STEP_END, BREAKPOINT, CLIENT_REQUEST, EVALUATION,
EVALUATION_IMPLICIT, UNSPECIFIED
.STEP_INTO, STEP_OVER, STEP_RETURN, CLIENT_REQUEST,
EVALUATION, EVALUATION_IMPLICIT, UNSPECIFIED
(3)eclipse平台是固有的线程安全的,因此保证所有类是线程安全的.
通过设计可以明示或者是暗示线程同步
(4)用户接口的actions, 例如 step命令是用过用户接口线程发出的
.Actions必须是non-blocking.
.我们这里使用step作为例子, 因为它们看起来step
应该被 block, 以便它们发出step debug 命令等待程序解释器step这一步, 但是那样是错误行为.
取而代之的是,解释器通过激发一个debug模型事件进行通讯交互
(5)一个SUSPEND事件使用BREAKPOINT或者CLIENT_REQUEST来激发
.转换perspectives和打开debug视图是可选的
.debug视图是扩展挂起线程并且选择它的最上端堆栈帧
.选择一个堆栈帧触发器:
..源文件查询, 添加一个指示点到editor上
..变量view窗口刷新
..一个SUSPEND事件是使用STEP_END激发
..最上端堆栈帧被选择并且触发源文件查询和变量view窗口刷新; 线程和堆栈帧标签被刷新
..在step运行过程中改变perspectives时候step状态不发生变化.
.当视图刷新它维持当前选择并且要基于相同元素扩展其状态
..如果元素维持状态它将被显示
..等式可以被执行, 它们可以产生很少垃圾的ID
.在交叉重复使用挂起状态的debug元素可以被重新使用
..在同一线程中线程和堆栈帧可以在同一个帧中描述
..变量的参考对象和值将在同一个对象中描述
.使用CLIENT_REQUEST激活RESUME事件
..Debug视图可以collapses所有挂起的线程
..可以选择变成空的堆栈帧, 清除变量view窗口
..清除已经重新开始的指示点
.使用STEP_INTO / OVER / RETURN激活RESUME 事件
..线程和帧在dubug窗口保持 expanded/selected状态
..如果SUSPEND/STEP_END在500ms内将不被接受:
..线程图标和标签被重新更新显示
..堆栈帧图标将被重新显示
3. breakpoints
1>step请求遇到breakpoint发生什么?
(1)依靠优先体系
(2)Java debugger当遇到一个breakpoint时候必须从JVM中清除这个step请求,否则在下一次使用之前必须完成这一步.
(3)在step过程中变量被改变 它们将用红色重新渲染
.变量必须实现hasValueChanged()方法
.引用中说: “returns whether the value of this variable has changed
since the last suspend event”
(4)在Java debugger中实现
.debug对象要保持一定数量的挂起多少次; 这个数量在每次挂起都要增加,及时的显示: 0, 1, 2, …
.每一次一个变量得到新值都要检查与最近一次访问时候是否发生变化,如果是这样, 这个数量要跟bebug目标挂起次数一致
.当变量的counter == debug counter它的值将被改变
2>什么是breakpoints?
.它是在制定位置挂起或者在某种条件下的一种方式
.行断点, 观察点, 运行到某一行等各种断点.
3>断点提供了多种特点:
.添加, 删除, 通知修改
.Persistence of breakpoints across workbench invocations
.临时地略过断点
.Retargettable actions for creating breakpoints
4>breakpoint器
(1) 断点管理器保存和持久化断点
(2) 断点
.提供用于操作的API (enable, set hit count, 等等)
.使用一个标志存储它的属性
(3)debug目标
.在安装,移除和更新时候通知断点作出反应
(3) breakpoint 模型
(4)
........................待续