使用 CDT 调试器,第 2 部分: 使用 Eclipse CDT 和 MI 访问 gdb
2009-12-19 00:00:00 来源:WEB开发网CDT 调试视图
只有使用适当的数据更新 Eclipse 的图形化显示时,MI-CDI-wrapper-Eclipse 通信才是有用的。图 1 显示 CDT 调试透视图,您可以看到许多呈现目标执行状态的视图。许多视图 — Breakpoints、Modules 和 Expressions — 都由 Eclipse 提供,但 CDT 在透视图中添加了三个视图:Executables View、Disassembly View 和 Signals。
图 1. CDT 调试透视图
查看原图(大图)
这些视图以相似的方式创建和接收调试事件。本节将解释 Signals 视图。该视图(上面已突出显示)列出所有目标能接收到的信号并显示哪些信号可以传递给进程。视图第一次出现时,SignalsViewContentProvider 调用 CDebugTarget 来提供一系列信号,这个目标访问 CDI 目标并在其 CDI 模型层次结构中请求信号。当返回 ICDISignals 数组后,CDebugTarget 更新它自身的模型元素并将它们发送至 SignalsViewContentProvider,SignalsViewContentProvider 使用这些模型元素来填充 Signals 视图。
当右键单击 Signals 视图中的条目时,Resume with Signal 上下文菜单选项允许您继续执行目标并将选定的信号发送到进程。这个选项调用 SignalsActionDelegate。当选中该选项时,delegate 调用 CDI 目标并使用与所选信号相对应的 ICDISignal 恢复执行。这个目标为信号创建一个 MI 命令并调用 MISession.postCommand() 向 gdb 发送命令。
当 gdb 响应后,更新 Signals 视图的过程需要五个步骤:
MISession 分析来自 gdb 的 MI 输出并判断某个信号设置是否被改变。如果是的话,触发 MISignalChangedEvent。
CDI EventManager 侦听 MISignalChangedEvent 并通过创建一个 CDI 事件 ChangedEvent 进行响应。然后触发事件并警告所有 ICDIEventListeners。
CDebugTarget 接收来自 EventManager 的事件并判断 ChangedEvent 是否和信号改变有关。如果是的话,调用它的 CSignalManager 来处理 CDI 事件。
CSignalManager 更新它的模型元素并触发 DebugEvent,后者的类型由 DebugEvent.CHANGE 给定。
SignalViewEventHandler 接收 DebugEvent,检查并确保它处理信号和刷新 Signals 视图。
了解 Signals 视图的相关操作非常重要,原因有二:它可以作为一个具体的示例演示各种不同的模型元素如何协同工作,另外它展示了如何构建与 Eclipse、gdb、CDI 交互的相似视图。
结束语
两个会话对象(MISession 和 Session),两个目标(CDebugTarget 和 Target)和两个层次结构完全不同的模型元素 — CDT 调试器的操作非常复杂,您可能怀疑开发人员是否会使用这么复杂的工具。然而 CDT 调试器的代码是通过模块化的方式编写的,对其内部工作原理的理解越透彻,就越容易插入自己的模块。记住:学习的过程虽然艰难,但为 CDT 添加新特性要比从头构建定制调试应用程序简单得多。
更多精彩
赞助商链接