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)
........................ 待续