dwarf2调试信息格式——chapter1,2

来源:互联网 发布:凤城高中淘宝屋 编辑:程序博客网 时间:2024/06/07 16:54

1.  引言

简单的说,调试信息就是在机器码和对应的源代码之间建立某种映射关系,用于提高调试程序的能力。

1.1     历史

DWARF的全称是"Debugging With Attributed RecordFormats",遵从GNU FDL授权。现在已经有dwarf1,dwarf2,dwarf3三个版本。

Dwarf最初被贝尔实验室设计用来供Unix System V的sdb调试器使用,并且在1989年被Unix国际化部门的PLSIG(Programming Languages Special Interest Group)标准化成为dwarf1.0。

但是dwarf1有着很多明显的缺点,于是PLSIG继续开发,改正了缺点,并加入了对C++等语言的支持,并在1990年正式公布了dwarf2的标准草案。但是稍后由于一些原因,PLSIG被解散,dwarf的开发陷入到多个并不合作的组织中间,造成dwarf2的一些实现细节要取决于特定的编译器。

这种情况一直持续到1999年,开发工作受到了来自实现对HP/Inter IA-64架构提供较好支持的推动,成立了dwarf委员会,dwarf的原作者担任负责人,开始了dwarf3的开发,并于2006年1月份推出dwarf3.0,同时为了解决分歧,dwarf委员会加入了自由标准组织,在自由标准组织与来自Linux基金会的OSDL(OpenSource Development Labs)合并后,dwarf重返独立状态并创建了自己的网站:dwarfstd.org

1.2     现状

目前,在这三个版本中,dwarf2对dwarf1的改变很大,dwarf3大多是对dwarf2的扩充。dwarf已经是一种独立的标准,可以支持C、C++、JAVA、Fortran等语言。

本文首先对DWARF2格式进行简介,然后简述在GDB中,如何对这些调试信息进行组织、实现,并且如何利用调试信息进行C语言级别的调试的。

1.  DWARF2格式简介

1      

1.1    简要

DWAREF2是一种调试信息格式,它不关心任何具体的实现,无论是何种编译器、调试器,只要在设计的时候,遵循DWARF2格式进行输出,然后调试器遵循DWARF2格式进行调试信息的解析即可。

实际上,DWARF2的设计目标就是向任何debugger提供一种易扩展、并向前兼容的且能够对源代码进行精确描绘的方法。该调试信息格式易扩展,并能很好的保持向前兼容。

本章后续一共2.2-2.6节它们主要是描述了DWARF2的调试信息格式的组织方式。其中,2.2节描述了调试信息的总体框架以及所有不同调试信息表项的信息和属性。

2.3节2.5节描述了具体的调试信息表项以及如何将这些描述源代码情况的信息传送给debugger;2.6节描述了其他调试信息的组织情况。

1.2    调试信息概述

DWARF使用一系列的调试信息表项定义出了对源程序的低层次的描述。每一个调试信息表项通过一个含有一些列属性的tag来描述。tag指明了该表项属于那种类型,而属性则表征着这个表项的一些特征。

图1给出了全部的tag名,一共是45个,它们所代表的内容将会在后续小节详细论述。DWARF2的调试信息表项是存在于目标文件中的.debug_info段中的。


图 1 tag名称一览

每一个属性值由属性名称来标识,一共59个属性名称,如图2所示;每一个属性值都由一种或者多种属性值格式,而每种属性值格式又可能有多种分类。比如,一个constant data有几个属性,那么它的这几个属性值得类别就是constant data,而constantdata又有1、2、4、8bytes或者是可变长度data这几种分类。那么这些属性值格式以及它们表示的意义如表1.



图 2 属性名称一览

表 1 属性值类型

编号

属性值类型

意义

1

address

运行程序在内存中的地址

2

block

未初始化的数据块(an arbitrary number of uninterpreted[U1]  bytes of data)

3

constant

常量数据

4

flag

某个属性存在与否的标志

5

reference

对调试信息表项的引用。有两类reference:1.相对于引用发生的编译单元起始处的偏移,并且只能引用本编译单元中的调试信息表项;2.调试信息表项的地址,只要求在同一个可执行文件或者可共享文件中,可以进行跨编译单元的引用。

6

string

字符串类型

              调试信息表项中的属性不分先后顺序,但是为避免定义模糊,在同一个属性不能在一个调试信息表项中出现两次。



0 0
原创粉丝点击