GDB MI 命令介绍
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;