请参阅“使用 Eclipse CDT 和 MI 访问 gdb ”一文。
GNU 调试器 (gdb) 是最流行的开源调试器。它通常用作命令行可执行文件,但可以使用鲜为人知的 MI 协议通过软件访问它。
- C/C++ 调试器接口 (CDI) 由 Eclipse/CDT 开发人员创建,因此 CDT 可以访问外部调试器。
- 机器接口 (MI) 由 gdb 开发人员创建,因此外部应用程序可以访问 gdb。
在许多情况下,MI 结果记录后跟 (gdb) 和带外 (OOB) 记录。这些记录提供有关目标或调试环境状态的附加信息。
-exec-step 之后的 *stopped 消息是一个 OOB 记录,它提供有关断点、观察点以及目标停止或完成的原因的信息。
在上一个会话中,gdb 在每个 -exec-step 之后返回 *stopped,reason="end-stepping-range" 以及目标的状态。
gdb/MI 对人类来说很难理解,但它非常适合软件进程之间的通信。
CDT 通过创建一个发送和接收数据的伪终端 (pty) 来实现这种通信。然后,它启动 gdb 并创建两个会话对象来管理调试数据。
MI-CDI-wrapper-Eclipse 通信只有在使用适当的调试数据更新 Eclipse 的图形显示时才有用。
当您右键单击 Signals 视图中的条目时,Resume with Signal 上下文菜单选项允许您继续执行目标并将选定的信号发送到进程。
此选项调用SignalsActionDelegate
. 选择此选项后,委托调用 CDI 目标以使用与选定信号对应的信号
恢复其执行。
目标为信号创建一个 MI 命令并调用 MISession.postCommand(),它将命令发送到 gdb。ICDISignal
当 gdb 响应时,更新 Signals View 的过程需要五个步骤:
- MISession 分析来自 gdb 的 MI 输出并确定是否正在更改信号设置。如果是这样,它会触发 MISignalChangedEvent。
- CDI EventManager 侦听 MISignalChangedEvent 并通过创建 CDI 事件进行响应:ChangedEvent。然后它触发事件并提醒所有 ICDIEventListener。
- CDebugTarget 从 EventManager 接收事件并确定 ChangedEvent 是否与信号更改相关。如果是这样,它会调用其 CSignalManager 来处理 CDI 事件。
- CSignalManager 更新其模型元素并触发 DebugEvent,其类型由 DebugEvent.CHANGE 给出。
- SignalViewEventHandler 接收 DebugEvent,检查以确保它处理信号,并刷新 Signals View。
了解信号视图所涉及的操作很重要,原因有二:
- 它作为不同模型元素如何协同工作的具体示例,以及
- 它展示了如何构建与 Eclipse、gdb 和 CDI 交互的类似视图。
结论
- 两个会话对象(
MISession
和Session
),
- 两个目标(
CDebugTarget
和Target
),和
- 两种完全不同的模型元素层次结构