例如:
<0>: Abbrev Number: 1 (DW_TAG_compile_unit)DW_AT_producer : (indirect string, offset: 0xe): GNU C1 1 5.4.0 20160609 -masm=intel -m32 -mtune=generic -march=i686 -g -fst ack-protector-strong <10> DW_AT_language : 12 (ANSI C99) <11> DW_AT_name : (indirect string, offset: 0xbe): hell o.c <15> DW_AT_comp_dir : (indirect string, offset: 0x97): /tmp <19> DW_AT_low_pc : 0x804840b <1d> DW_AT_high_pc : 0x2e <21> DW_AT_stmt_list : 0x0 <1><25>: Abbrev Number: 2 (DW_TAG_base_type) <26> DW_AT_byte_size : 4 <27> DW_AT_encoding : 7 (unsigned) <28> DW_AT_name : (indirect string, offset: 0x77): unsi gned int <1><2c>: Abbrev Number: 2 (DW_TAG_base_type) <2d> DW_AT_byte_size : 1 <2e> DW_AT_encoding : 8 (unsigned char) <2f> DW_AT_name : (indirect string, offset: 0x84): unsi gned char <1><33>: Abbrev Number: 2 (DW_TAG_base_type) <34> DW_AT_byte_size : 2 <35> DW_AT_encoding : 7 (unsigned) <36> DW_AT_name : (indirect string, offset: 0xa1): shor t unsigned int
在每个模具入口的开始,有一个数字,如<0>
,<1>
...什么做这些数字意味着?似乎相同的数字表示相同的DWARF类型,我想例如条目具有<1>
均值它们都是 (DW_TAG_base_type)
.
DWARF DIE排列在树上.最左边的数字告诉你DIE的深度.在你的例子中:
<0>: Abbrev Number: 1 (DW_TAG_compile_unit)
这<0>
意味着这个DIE出现在最外层.这只适用于编译或类型单元DIE.
然后:
<1><25>: Abbrev Number: 2 (DW_TAG_base_type)
这个DIE是编译单元DIE的子代.
你可以得到更深的嵌套; 例如,函数的局部变量可能是非常深层嵌套的,具体取决于函数的块结构.命名空间中的项也可以嵌套.