1

我想知道 Eclipse Workbench UI 如何与 GNU 调试器通信。我的意思是在 C/C++ 的 Eclipse 中,当我们按下菜单中的 step over 或 resume 或 continue 按钮时,幕后会发生什么?就像如何调用 GNU gdb 一样?gdb 如何知道要执行哪个函数?UI 如何与 gdb 通信?我已经向 gdb 添加了一个自定义函数(不管函数是什么......),我想向 Eclipse 工作台添加一个按钮,以便按下按钮将调用 gdb,特别是该函数。我想知道 Eclipse 工作台 UI 如何与 GNU gdb 交互。我该怎么做呢?

谢谢,罗希特

4

1 回答 1

5

请参阅“使用 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 的过程需要五个步骤:

  1. MISession 分析来自 gdb 的 MI 输出并确定是否正在更改信号设置。如果是这样,它会触发 MISignalChangedEvent。
  2. CDI EventManager 侦听 MISignalChangedEvent 并通过创建 CDI 事件进行响应:ChangedEvent。然后它触发事件并提醒所有 ICDIEventListener。
  3. CDebugTarget 从 EventManager 接收事件并确定 ChangedEvent 是否与信号更改相关。如果是这样,它会调用其 CSignalManager 来处理 CDI 事件。
  4. CSignalManager 更新其模型元素并触发 DebugEvent,其类型由 DebugEvent.CHANGE 给出。
  5. SignalViewEventHandler 接收 DebugEvent,检查以确保它处理信号,并刷新 Signals View。

了解信号视图所涉及的操作很重要,原因有二:

  • 它作为不同模型元素如何协同工作的具体示例,以及
  • 它展示了如何构建与 Eclipse、gdb 和 CDI 交互的类似视图。

结论

  • 两个会话对象(MISessionSession),
  • 两个目标(CDebugTargetTarget),和
  • 两种完全不同的模型元素层次结构
于 2009-06-08T19:49:10.420 回答