我想知道Eclipse Workbench UI如何与GNU调试器通信。 我的意思是在Eclipse for C / C ++中,当我们按下菜单中的步骤或继续或继续按钮时,幕后会发生什么? 如何调用GNU gdb? gdb如何知道要执行哪个函数? UI如何与gdb通信? 我已经为gdb添加了一个自定义函数(无论函数是什么......)我想在Eclipse工作台中添加一个按钮,按下按钮将特别调用gdb和该函数。 我想知道Eclipse workbench UI如何与GNU gdb交互。 我该怎么做呢?
谢谢, 罗希特夏尔
答案 0 :(得分:5)
请参阅“Accessing gdb with the Eclipse CDT and MI”文章。
GNU调试器(gdb)是最常用的开源调试器。它通常用作命令行可执行文件,但可以使用鲜为人知的MI协议通过软件访问它。
- C / C ++调试器接口(CDI)由Eclipse / CDT开发人员创建,因此CDT可以访问外部调试器。
- 机器接口(MI)由gdb开发人员创建,因此外部应用程序可以访问gdb。
在许多情况下,MI结果记录后跟(gdb)和带外(OOB)记录。这些记录提供有关目标状态或调试环境的其他信息 -exec-step之后的* stopped消息是一个OOB记录,它提供有关断点,观察点以及目标暂停或完成的原因的信息。
在上一个会话中,gdb在每个-exec步骤之后返回* stopped,reason =“end-stepping-range”以及目标的状态。gdb / MI很难让人理解,但它非常适合软件进程之间的通信 CDT通过创建发送和接收数据的伪终端(pty)来启用此通信。然后,它启动gdb并创建两个会话对象来管理调试数据。
只有在使用适当的调试数据更新Eclipse的图形显示时,MI-CDI-wrapper-Eclipse通信才有用。
右键单击“信号视图”中的条目时,“使用信号恢复”上下文菜单选项可以继续执行目标并将所选信号发送到流程。
此选项会调用SignalsActionDelegate
选择此选项后,委托调用CDI目标以使用与所选信号对应的ICDISignal
继续执行。
目标为信号创建MI命令并调用MISession.postCommand(),它将命令发送到gdb。当gdb响应时,更新信号视图的过程需要五个步骤:
- MISession分析来自gdb的MI输出,并确定是否正在更改信号设置。如果是这样,它会触发一个MISignalChangedEvent。
- CDI EventManager侦听MISignalChangedEvent并通过创建CDI事件来响应:ChangedEvent。然后它会触发事件并警告所有ICDIEventListeners。
- CDebugTarget从EventManager接收事件,并确定ChangedEvent是否与信号更改有关。如果是这样,它会调用其CSignalManager来处理CDI事件。
- CSignalManager更新其模型元素并触发DebugEvent,其类型由DebugEvent.CHANGE提供。
- SignalViewEventHandler接收DebugEvent,检查以确保它处理信号,并刷新信号视图。
醇>了解信号视图的相关操作非常重要,原因有两个:
- 它是不同模型元素如何协同工作的具体示例,
- 它展示了如何构建与Eclipse,gdb和CDI交互的类似视图。
结论
MISession
和Session
),CDebugTarget
和Target
)和