GDB 的MI接口


背景介紹:

libgdb過時了,目前的GDB調試前端都不用libgdb

目前有兩種比較流行:
- MI接口,現在應該是MI II接口,是Eclipse CDT所采用的方式
- emac輸出接口,這個似乎有更多的調試前端所采用,例如DDD,kdbg,codeblocks等等

另外還有一種比較另類的一種方式:insight,直接把gdb給包含進去了

MI不但包括了CLI的所有命令,還具備一些CLI所不提供的功能,也就是說MI的命令一般與gdb的命令有一個映射的關系。當然,MI接口的設計初衷是面向將 GDB作為系統組件之一的復雜系統。在類似於DDD,Insight等以GDB為后端(backend)的GUI debugger的實現中,就是充分利用了GDB MI接口。MI最大的不足在於其輸出的文本流接口比較復雜,必須很熟悉其輸出格式才能理解,不如CLI輸出直觀。

 
簡單地說,GDB MI interpreter 接受字符串形式的命令輸入,然后產生一行表示命令執行結果的輸出。當然,這里的輸入命令和輸出記錄都有嚴格的格式和內容定義。而且,根據命令的不同(同步 命令或異步命令),GDB的輸出也代表不同的含義。當利用GDB MI實現一個GUI的debugger時,通常的做法是使用一個進程負責管理GDB,將GDB作為其子進程派生出來后,接管其標准I/O,並通過pipe 向GDB注入MI命令,並接收GDB MI輸出。自然,該進程的另一個工作就是與GUI前端交互,完成GUI命令解析以及返回相應record. Simple?:-)
 
Insight使用Tcl/tk實現前端GUI,DDD使用的則是Gtk。前段時間正好學習了Python,是不是可以用Python+GDB MI來作一個GUI Debugger?正好還可以復習一下前一陣子看過的程序link and load 過程。
 
注:GDB MI的詳細介紹參見GDB 手冊: Debugging with GDB.其中專門一章討論MI接口。

 

 

MI(翻譯為Machine Interface)。因為最近在用Eclipse的CDT調試C/C++,當然Eclipse本質gdb的調用,對於gdb的命令很多人可能都已經很熟悉了,本文介紹的mi層命令可能很少有人用到,它也是gdb的一部分,主要目的是為一些目標系統如IDE等提供調試功能,如eclipse下c/c++的cdt插件的底層就是調用的mi層命令,cdt的包里面有兩個類RxThread,TxThread就是一個發送mi命令,一個接收返回數據的,大家有興趣可以研究下。

 

進入命令 gdb --interpreter mi [exec_file]

退出命令 quit

 

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.其它雜項

 

像我們在Eclipse 的console上見到的-var-evaluate-expression,-stack-list-locals,-exec-continue 諸如此類的都是mi的命令。

 

references:

http://ftp.gnu.org/old-gnu/Manuals/gdb/html_node/gdb_211.html#SEC216

http://jlspyaozhongkai.blog.163.com/blog/static/116057464200995103415205/

http://blog.csdn.net/coutcin/article/details/1074330   (一些mi命令詳解可以參考這里)

http://www.ibm.com/developerworks/cn/opensource/os-eclipse-cdt-debug1/

http://www.ibm.com/developerworks/cn/opensource/os-eclipse-cdt-debug2/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM