GDB MI 命令介绍

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

GDB MI 命令介绍

libgdb过时了,目前的GDB调试前端都不用libgdb目前有两种比较流行:

- MI接口,现在应该是MI II接口,是Eclipse CDT所采用的方式

- emac输出接口,这个似乎有更多的调试前端所采用,例如DDD,kdbg,codeblocks等等另外还有一种比较另类的一种方式:insight,直接把gdb给包含进去了

=========================================GDB MI Interface虽

然使用GDB已经很多年了,但是直到最近因为工作需要才知道GDB除了CLI(Commnad Line

Interface)命令外,还有一个更重要的MI (Machine Interface)命令。之所以“更重要”,因为MI不但包括了CLI 的所有命令,还具备一些CLI所不提供的功能。当然,MI 接口的设计初衷是面向将

GDB作为系统组件之一的复杂系统。在类似于DDD,Insight 等以GDB为backend的GUI

debugger的实现中,就是充分利用了GDB

MI接口。MI最大的不足在于其输出比较复杂,必须很熟悉其输出格式才能理解,不如CLI输出直观。但这只是习惯问题,多用多读自然就OK啦。

简单地说,GDB MI interpreter

接受字符串形式的命令输入,然后产生一行表示命令执行结果的输出。当然,这里的输入命令和输出记录都有严格的格式和内容定义。而且,根据命令的不同(同步

命令或异步命令),GDB的输出也代表不同的含义。当利用GDB

MI实现一个GUI的debugger时,通常的做法是使用一个进程负责管理GDB,将GDB作为其子进程派生出来后,接管其标准I/O,并通过pipe

向GDB注入MI命令,并接收GDB MI输出。自然,该进程的另一个工作就是与GUI前端交互,完成GUI命令解析以及返回相应record.

Insight使用Tcl/tk实现前端GUI,DDD使用的则是Gtk。前段时间正好学习了Python,是不是可以用Python+GDB MI 来作一个GUI Debugger?正好还可以复习一下前一阵子看过的程序link and load 过程。

注:GDB MI的详细介绍参见GDB 手册:Debugging with GDB.其中专门一章讨论MI接口。

==================================对于gdb的命令很多人可能都已经很熟悉了,本文介绍的mi层命令可能很少有人用到,它也是gdb的一部分,主要目的是为一些目标系统如IDE等提

供调试功能,如eclipse下c/c++的cdt插件的底层就是调用的mi层命令,cdt的包里面有两个类RxThread,TxThread就是一个

发送mi命令,一个接收返回数据的,大家有兴趣可以研究下。

mi的命令依然是以文本行方式提供的,并兼容我们常用的gdb CLI命令,下面我们看一下它的进入和退出:

进入命令gdb --interpreter mi ****.exe

退出命令quit

效果如下:libo@libo-desktop:~$ gdb --interpreter mi ~"GNU gdb (GDB) 7.1-ubuntu\n"

~"Copyright (C) 2010 Free Software Foundation, Inc.\n" ~"License GPLv3+: GNU GPL version 3 or later

</licenses/gpl.html>\n"

~"This is free software: you are free to change and redistribute

it.\n"

~"There is NO WARRANTY, to the extent permitted by law. Type \"show copying\"\n"

~"and \"show warranty\" for details.\n"

~"This GDB was configured as \"i486-linux-gnu\".\n" ~"For bug reporting instructions, please see:\n"

~"</software/gdb/bugs/>.\n"

=thread-group-created,id="42000"

=thread-created,id="1",group-id="42000"

*stopped,frame={addr="0x00000000",func="??",args=[]},threa d-id="1",stopped-threads="all"

@"JTAG speed set to 100 kHz\r\n"

@"Target endianess set to \"little endian\"\r\n"

@"Select flash device: STM32F103RB\r\n"

@"Flash download enabled\r\n"

@"Flash breakpoints enabled\r\n"

@"Resetting target\r\n"

@"Sleep 500ms\r\n"

@"Writing register (SP = 0x20005000)\r\n"

@"Writing register (PC = 0x08001739)\r\n"

(gdb)

quit

&"quit\n"

=thread-group-exited,id="42000"

libo@libo-desktop:~$ mi的命令总共分为以下几个部分:

1.断点(Breakpoint)

2.程序环境(Program Context)

3.线程(Thread)

4.程序执行(Program Execution)

5.栈(Stack)

6.变量(Variable)

7.数据(Data)

8.跟踪点(Tracepoint)

9.符号(Symbol)

10.文件(File)

11.目标数据(Target Manipulation)

12.其它杂项

我们以下面这段代码为例演示各种命令的执行结果:

/*

** demo.c

*/#include <stdio.h>int swap(int a[], int len)

{

int i;

相关文档
最新文档