dwarf调试信息格之式入门
时间:2007-04-04 来源:loughsky
DWARF的全称是"Debugging With Attributed Record Formats",遵从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(Open Source Development Labs)合并后,dwarf重返独立状态并创建了自己的网站:dwarfstd.org。
这三个版本中,dwarf2对dwarf1的改变很大,dwarf3大多是对dwarf2的扩充。 现在dwarf已经是一种独立的标准,可以支持C、C++、JAVA、Fortran等语言。 在了解了dwarf的历史之后,来看一下如何查看dwarf所包含的调试信息内容,并在下一篇文章中介绍这些内容的具体意思。查看内容的工具常用的有四种:



















然后使用gcc –g hello.c –o hello编译。生成hello文件。
[Nr] Name Type Addr Off Size
[ 2] .ARM.exidx ARM_EXIDX 000086c4 0086c4 000008
[12] .ARM.attributes ARM_ATTRIBUTES 00000000 008f84 000010
[16] .strtab STRTAB 00000000 009a9c 000416
<0><b>: Abbrev Number: 1 (DW_TAG_compile_unit)
DW_AT_language : 1 (ANSI C)
DW_AT_comp_dir : C:\Program Files\CodeSourcery\Sourcery G++\bin
DW_AT_frame_base : 0 (location list)
<2><79>: Abbrev Number: 3 (DW_TAG_variable)
<2><85>: Abbrev Number: 3 (DW_TAG_variable)
DW_AT_location : 2 byte block: 91 6c (DW_OP_fbreg: -20)
<1><92>: Abbrev Number: 4 (DW_TAG_base_type)
<1><99>: Abbrev Number: 5 (DW_TAG_subprogram)
<2><b2>: Abbrev Number: 6 (DW_TAG_formal_parameter)
DW_AT_location : 2 byte block: 91 6c (DW_OP_fbreg: -20)
<2><be>: Abbrev Number: 6 (DW_TAG_formal_parameter)
Extended opcode 2: set Address to 0x81ac
Special opcode 9: advance Address by 0 to 0x81ac and Line by 4 to 5
Special opcode 120: advance Address by 16 to 0x81bc and Line by 3 to 8
Special opcode 90: advance Address by 12 to 0x81c8 and Line by 1 to 9
Special opcode 88: advance Address by 12 to 0x81d4 and Line by -1 to 8
Special opcode 78: advance Address by 10 to 0x8200 and Line by 3 to 11
Special opcode 34: advance Address by 4 to 0x8204 and Line by 1 to 12
Special opcode 120: advance Address by 16 to 0x8214 and Line by 3 to 15
Special opcode 174: advance Address by 24 to 0x822c and Line by 1 to 16
Special opcode 90: advance Address by 12 to 0x8238 and Line by 1 to 17