• gdb mi接口命令入门大全


    gdb入门的话,先看看我这个博客

    gdb入门教程大全(清晰明了)_标biao的博客-CSDN博客

    gdb mi简介

    gdb mi接口协议有3个版本 GDB/MI Development and Front Ends (Debugging with GDB)

    与gdb版本对应关系如下:(gdb指的是gdb.exe(文中简称为gdb),而gdb mi指的是和gdb.exe进行通信的通信协议

     新版本gdb照样兼容旧版本的gdb mi协议, 但是旧版本gdb当然用不了新版本的gdb mi协议。

    建议用旧版本的gdb mi协议,因为,无论旧版本的gdb还是新版本的,都能成功使用。因为在嵌入式开发中,往往用的gdb都是版本多种多样,而且往往都比较旧(比如我的桌面程序开发gdb就是10.2版本,但是嵌入式gdb版本是7.10,版本差别很大,导致有些高版本的gdb mi命令在嵌入式gdb就用不了,下面的示例将会看到这一点)。

    旧版本gdb mi参考资料

    旧版本的gdb mi接口官方手册网址:(5.1版本)
    Debugging with GDB - Table of Contents 关于整个gdb的

    Debugging with GDB - GDB/MI 里面的gdb mi这部分的

    精简的的中文参考博客 GDB/MI 层命令介绍_coutcin的博客-CSDN博客

    该作者对该文档进行了大致翻译 GDB/MI 命令总结_哭哭啼的博客-CSDN博客_gdb mi

    新版本gdb mi参考资料

    官方网址:GDB/MI (Debugging with GDB)

    gdb mi接口教程大纲

    进入旧版的教程网站:Debugging with GDB - GDB/MI

    主要内容分为如下几部分:命令非常少,学一下就行了。如果功能不够的话,那就混合着用一些gdb cli命令吧,参考本文开头说的这个博客:gdb入门教程大全(清晰明了)_标biao的博客-CSDN博客

    注意:

    GDB/MI Variable Objects 表示对变量,表达式,内存,寄存器创建一个变量对象(也叫观察对象),相当于调试时候的添加监视功能。这样gdb就能输出一个嵌套结构体变量的层级结构了,这个在IDE中非常有用。如果我们只是利用 Debugging with GDB - GDB/MI Stack Manipulation 章节的-stack-list-locals命令,是不能打印出复合结构体的层级数据的。注:必须先创建对象,不创建直接用这个变量名打印孩子变量会报错的。

    应用示例记录

    这里旧版本:指5.1版本的gdb mi协议,新版本指9.1版本的gdb mi协议

    基本用法

    • 断点插入命令
      旧版本:
       -break-insert [ -t ] [ -h ] [ -r ]
          [ -c condition ] [ -i ignore-count ]
          [ -p thread ] [ line | addr ]
      
      [xx]代表可选项
      语义:-t 插入一个临时断点
      -h 插于一个硬件端点
      -r 插入一个正则断点,当函数名匹配正则表达式时有效
      -c 插入一个条件断点
      -i 插入一个指定无效次数的断点

      插入指定文件,行号的断点,-break-insert filename:lineNumber(嵌入式端gdb版本低,所以这样是对的)

      查看更多,就按照上面我推荐的博客去看看吧,不难


      新版本:
      -break-insert  --source "xx/main.c" --line 99这样的,但是这个在旧版本的gdb.exe中就不能识别,会报错 Unknown option ''-source''"。

      所以特别注意,可能有些命令旧版本gdb 跟 新版本gdb不一样的,好不好使,就看gdb反馈的信息是不是^error,是的话,就看看是什么问题

    关于反汇编 寄存器方面操作

    Debugging with GDB - GDB/MI的数据操作这一章节 Debugging with GDB - GDB/MI Data Manipulation

    mi模式下,cli模式的命令照样可以正常输入,反馈的信息就是“~”开头的了

    •  反汇编操作: -data-disassemble

      但是这个mi接口的反汇编好像有点弱鸡,由于反汇编是为了直接给人读,所以我们需要用到cli模式中的命令disa,它可以直观的显示出反汇编和源码混合显示。所以告诉我们一个道理,如果有些信息需要直接给人显示的,那么就用cli接口的命令,如果只是为了查询到信息给机器解析用,那么就用mi命令就行。(反正在mi即可模式下,两者命令可以混合用,所以当然让gdb直接进入mi模式就好啦。后面会说,cli模式下照样可以用mi命令)
       
    • 寄存器操作:-data-list-register-names 查询所有的寄存器名字列表
      -data-list-register-values 查看指定寄存器的值等
    • 内存读写操作:-data-read-memory

    一些重要笔记点

    关于输入命令详情:Debugging with GDB - GDB/MI Input Syntax,输出信息详情:Debugging with GDB - GDB/MI Output Syntax

    它们能在mi接口模式下混合输入(所以如果mi接口提供的命令的功能还不够,那么我们就输入cli模式的命令吧(这个命令就特别丰富了,功能非常强大,看本文开头引入的那个参考博客即可),也是可以的,但是一般常用的调试功能,mi接口提供的命令的功能就够了)。

    认真读一读官方mi接口命令的网页,很清晰的,重要点介绍如下: 

    • mi接口返回的信息,总是只有一行(所以大量的信息都会输出在一行),而且大量加了引号,有点像json风格,所以说这个是机器接口(对于单行的字符串解析更快吧),对于人的可读性不好
    • 返回信息总是以 (gdb) 这个字符串结尾
    • gdb在mi接口模式下,仍然能接收cli命令(模式的命令正常我们人工用gdb调试用的),但是返回的信息都是以 “~”结尾,而且是多行的GDB/MI Output Syntax (Debugging with GDB)

    cli模式下,还能看一个嵌套结构体的值展开 Data (Debugging with GDB)

    gdb还有一些其它接口,比如tui接口,这个是图形化接口,可以文本形式图形化出来界面,但是mi接口模式开启后,这些接口的命令很多都会执行失败了,所以mi接口只兼容cli模式的命令(这个也称为标准命令,或者说控制台console解释器)。此外,其实就算在cli模式下,仍然可以用mi模式命令,但是得加一个 interpreter-exec mi "-data-list-register-names" 类似这样使用。Interpreters (Debugging with GDB)

    提醒:如果mi接口模式的命令功能不够用了(比如我们就想直接显示gdb反馈信息给用户看,所以mi命令就不合适了),我们就用cli接口模式的命令,这个去看官方对应gdb文档就行,非常详细,gdb文档哪个版本都可以 Top (Debugging with GDB) 建议看本文开头引入的那个参考博客,因为是总结性的

    这个是命令大全(里面还显示这些命令是否是mi模式命令),一个网页全部展示,方便我们快捷搜索的,做的真好

    Command and Variable Index (Debugging with GDB)

  • 相关阅读:
    用 C实现 CRC-16/MODBUS x16+x15+x2+1校验计算
    Python-表白小程序练习
    java毕业设计超市网站mybatis+源码+调试部署+系统+数据库+lw
    数据结构(4)树形结构——二叉树(概述、前序、中序、后序、层序遍历JAVA实现)
    MFC Windows 程序设计[122]之树形下拉列表框
    C语言每日一练——Day01:求最大公约数(三种方法)
    【Java】常用的文件操作
    网络安全(黑客)自学
    常用眼底图像数据集简介及下载--糖尿病视网膜病变(Eyepacs,APTOS2019,Messdior,Messdior-2,STARE数据集)
    VBA技术资料MF52:VBA_在Excel中突出显示前 10 个值
  • 原文地址:https://blog.csdn.net/kangkanglhb88008/article/details/126893164