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模式命令),一个网页全部展示,方便我们快捷搜索的,做的真好