GDB MI接口

发布时间 2023-12-12 16:39:03作者: 指剑问道

功能和目的

GDB的MI接口是一个面向机器的基于行操作的文本接口。通过--interpreter=mi可以进入该模式。主要用于继承开发环境(一般包含编辑器,编译器,连接器,调试器等)中的一个调试组件。

符号和术语说明

  • | 区分两个选项。

  • [ something ] 说明该部分内容是可选的,可以给出也可以不给出。

  • ( group )* 表示括号内的内容可以重复零次或多次。

  • ( group )+ 表示括号内的内容可以重复一次或多次。

  • ( group ) 表示括号内的组只能出现一次。

  • "string" 表示文字字符串。

GDB/MI 前端与GDB的交互涉及三个部分——发送到 GDB 的命令、对该命令的响应和通知。每个命令都会产生一个响应,指示命令执行成功或错误。对于不恢复目标的命令,响应都包含请求的信息。对于恢复目标的命令,响应仅指示目标是否成功恢复。通知是报告目标状态(或GDB状态)的一种机制,它无法和命令关联并作为该命令响应的一部分进行响应。

重要的通知示例:
  • 执行通知。 这些用于报告目标状态的变化——当目标恢复或停止时。 在恢复命令的响应中包含此信息是不可行的,因为一个恢复命令可能会在不同的线程中导致多个事件。此外,在目标中发生任何事件之前可能会经过相当长的一段时间,而前端需要知道是否 恢复命令本身已成功执行。

  • 控制台输出和状态通知。 控制台输出通知用于报告 CLI 命令的输出以及其他命令的诊断。 状态通知用于报告长时间运行的操作的进度。当然,在命令响应中包含此信息意味着在命令完成之前不会产生输出,这是不可取的。

  • 一般通知。 命令可能会对 gdb 或目标状态产生超出其官方目的的各种副作用。 例如,命令可以更改选定的线程。 尽管此类更改可以包含在命令响应中,但使用通知可以实现更加正交的前端设计。

无法保证每当 MI 命令报告错误时,gdb 或目标都处于任何特定状态,特别是状态不会恢复到处理 MI 命令之前的状态。 因此,每当 MI 命令导致错误时,我们建议前端刷新用户界面中显示的所有信息。