gdb学习小结

来源:互联网 发布:mac手写输入法怎么取消 编辑:程序博客网 时间:2024/06/03 17:16

2005.04.08 移自原博客中国

gdb学习总结-2005、04

最近看一些有关调试器的实现原理文章,当然,作为开源项目的gdb就自然跑不了被推敲一番。

gdb功能非常强大,他除了可以实现普通商业调试器几乎所有的功能外,其当中蕴涵的一些设计思想也颇有值得人学习之处。比如说,他对用户接口的封装,使得人们对gdb加入图形界面的支持相对容易,事实上,一些基于开源gdb的guigdb如insight,ddd等正是利用了这一特性。insight则是将gdb中用户接口中显示函数指向了用tcl/tk实现的函数,在事件的处理中融入了图形窗口的消息处理。达成了较为完美的结合(当然,个人认为gdb的代码并非十分漂亮,实际上都快达到了令人郁闷的境界了)。当然,gdb也有一些不经人意的地方,如代码效率低、不支持多进程,多目标的调试(据说gdb已经在开始从事这方面的改进了),对远程嵌入式目标的调试支持让人不怎么放心,等等。

费话不说了,还是讲讲gdb内的东西。gdb总体上说包含一下几个重要的部分:

1、事件机制:gdb的时间来源于目标和用户两部分,用户部分显然,值得是一些用户输入命令后产生的事件;目标部分则指运行待调试进程或一些其它东西在运行过程中产生的一些事件或信号,如sigtrap,sigexit等。这些事件会被放入队列里并依次得到处理。同步和异步是gdb里的两种事件模型,他们处理的机制是不一样的。

2、目标系统:目标系统包含几个重要概念,target_structs, target_ops, target_obstack。其中targetstruct是一个数组,其中存放了gdb所支持的target,他在initialize_XXX中函数中调用add_target的时候被加入。target_ops则是一个结构,他包含了目标的几乎所用基本信息及操作目标的函数(可以把他看成一个类).target_obstack则是当前运行的调试目标,栈底的冬冬是一个叫dummy_target的东西,这东西被所用target继承,也是唯一一个在_initialize_xxx被push进obstack的东西。其它的目标则是在调用to_open的时候被push进去的,push进去后更新当前current_target,之后gdb的所用的目标操作都是调用current_target进行的。仿真,进程、可执行文件、core等都是其目标系统的概念范畴。

3、输入输出:uifile,他包含信息和io函数。very easy的。

4、符号处理:这可是gdb中的重中之中了,没有符号处理,调试的优势就当然无存了,调试人员面对的可能就是一些繁琐的机器吗或汇编了。我们知道,我们的目标文件可能由几个object编译连接二来,而且在运行时可能还需要其它库的帮助。这每一个东西都有他自己的符号信息。或全局,或局部的。gdb中自己维护这些文件的符号信息,通过一系列的基本数据结构。有最小符号表,部分符号表,完全符号表。另外还有一个管理用的objfile结构。objfile是每个调试目标文件都会有的一个结构,多个文件通过链表连接。在objfile中含有上面所说的3个符号表的指针,他们仍然是链表结构的指针。其中部分符号表是暂存的,因为读取符号信息时总是先找完全符号表,找不到时才从轻便的部分表里读取简单信息,然后利用部分表里的读完全表指针读取详细信息,并存入完全表里。达到最终不用部分表。最小符号表则是放一些连接时需要的信息。哪怕是在linux下用gcc用不含g的参数编译出来的程序被读取,也可一包含这些信息(只要他们不被strip)。所以哪怕是没有用g参数编译,也是可以进行符号调试的。

5、远程调试:gdb实现了多种调试通讯协议。RSP是其自带的协议。其缺陷是文档落后陈旧,你想完整实现一个支持各个gdb版本的rsp支持,嘿嘿恐怕还需要盲干。他提供了stub和gdbserver两种方案来对远端进行调试。

6、目标控制:对于进程,gdb提供了inferior来对进程进行控制。实现调试的方法有,利用ptrace和proc文件系统,proc文件系统是目前的趋势。

7、其它:如支持多语言,表达式,内置断点、观察点、条件断点,事件钩子,支持各种虚拟机上应用程序或系统的调试,对trace的支持,多种方式的单步等等,恐怕也只有gdb才有这么完整的实现。

如上讲的,不过是我个人对gdb的一些印象,至于细节,还需时间研究。各位老大勿抛装头。

0 0
原创粉丝点击