使用 CDT 调试器,第 2 部分: 使用 Eclipse CDT 和 MI 访问 gdb
2009-12-19 00:00:00 来源:WEB开发网当数据在 gdb 中来回传输时,TxThread 和 RxThread 创建并触发 MIEvent。例如,如果 TxThread 发送一个将断点切换到 gdb 的命令,它将创建一个 MIBreakpointChangedEvent。如果 RxThread 接收到来自 gdb 的结果记录为 ^running 的响应,则将创建一个 MIRunningEvent。这些事件不是 第 1 部分 所描述的 ICDIEvent 接口的实现。要搞清 MIEvent 和 ICDIEvent 之间如何联系,您应该理解 Session 对象。
Session、Target 和 EventManager
创建 MISession 后,GDBCDIDebugger2 创建一个 Session 对象来管理 CDI 的操作。当其构造器被调用时,Session 创建许多对象来协助进行管理。有两个对象尤其重要:Target(管理 CDI 模型并向调试器发送命令)和 EventManager(侦听由调试器创建的 MIEvent)。
正如 第 1 部分 中解释的一样,Target 接收来自 CDT 的调试命令并为调试器打包命令。例如,当您单击 Step Over 按钮时,CDT 查找当前的 Target 并调用 stepOver 方法。Target 的响应方式是创建 MIExecNext 命令和调用 MISession.postCommand() 执行步骤。MISession 将命令添加到其输出 CommandQueue 中,在这里使用上面描述的方式把命令传输给调试器。
会话的 EventManager 接收 gdb 输出(被打包到一个 MIEvent 中)。当创建这个对象时,将其作为运行中的 MISession 的一个 Observer 添加。当 MISession 触发 MIEvent 时,EventManager 进行解释并创建相应的 ICDIEvents。例如,当 MISession 触发 MIRegisterChangedEvent 时,EventManager 创建一个称为 ChangedEvent 的 CDI 事件。创建 CDI 事件后,EventManager 告诉所有相关的侦听器状态发生了改变。许多侦听器是 CDI 模型的元素,但一个重要的例外是一个称为 CDebugTarget 的对象。这是另一个模型层次结构(接下来将解释)的一部分。
更多精彩
赞助商链接