考虑下面的dwarf代码示例-
<0><b>: Abbrev Number: 1 (DW_TAG_compile_unit)
<c> DW_AT_producer : (indirect string, offset: 0xd): GNU C++ 4.3.0 20080428 (Red Hat 4.3.0-8)
<10> DW_AT_language : 4 (C++)
<11> DW_AT_name : (indirect string, offset: 0x75): test.cpp
<15> DW_AT_comp_dir : (indirect string, offset: 0x4d): /home/dwarf
<19> DW_AT_low_pc : 0x0
<21> DW_AT_high_pc : 0xb
<29> DW_AT_stmt_list : 0x0
<1><2d>: Abbrev Number: 2 (DW_TAG_class_type)
<2e> DW_AT_name : C
<30> DW_AT_byte_size : 8
<31> DW_AT_decl_file : 1
<32> DW_AT_decl_line : 1
<33> DW_AT_sibling : <0x86>
<2><37>: Abbrev Number: 3 (DW_TAG_member)
<38> DW_AT_name : x
<3a> DW_AT_decl_file : 1
<3b> DW_AT_decl_line : 7
<3c> DW_AT_type : <0x86>
<40> DW_AT_data_member_location: 2 byte block: 23 0 (DW_OP_plus_uconst: 0)
<43> DW_AT_accessibility: 3 (private)
<2><44>: Abbrev Number: 3 (DW_TAG_member)
<45> DW_AT_name : y
<47> DW_AT_decl_file : 1
<48> DW_AT_decl_line : 8
<49> DW_AT_type : <0x86>
<4d> DW_AT_data_member_location: 2 byte block: 23 4 (DW_OP_plus_uconst: 4)
<50> DW_AT_accessibility: 3 (private)我一直在开发一个解析dwarf文件的程序,但我对其中的一部分不太确定。如果你注意到了,每个标签的左边都有一个额外的数字(在这个例子中有<0>,<1>和<2>)。我不太确定这是什么。我认为它是某种堆栈级别的东西,因为<0>被赋予整个程序,<1>被赋予顶级类,<2>被赋予其成员变量。然而,我在documentation中找不到任何关于它的东西。作为参考,以下是原始程序-
class C {
public:
C();
C(int x, int y);
int getX();
private:
int x;
int y;
};
class SubC : public C {
int z;
};
int f() {return 0;}
C c;
SubC subC;
int i;
double d;发布于 2013-06-06 15:14:09
DWARF DIE以树的形式组织--单个文件的顶级DW_TAG_compile_unit将包含所有类型定义(例如DW_TAG_class_type)、所有函数(DW_TAG_subprogram)和全局/静态变量(DW_TAG_variable)。类定义(DW_TAG_class_type)将是一个父骰子,并包含一些子元素,如成员变量的DW_TAG_member或方法的DW_TAG_subprogram。
您附加的输出是特定的DWARF dumper的操作方式-它看起来是在使用这个数字来显示父/子关系。是readelf吗?其他的dwarf dumper程序可能会选择以不同的方式显示这一点。在Mac上,dwarfdump显示了这种与缩进的关系-子骰子的缩进略多于父骰子的缩进。
如果您正在查看http://dwarfstd.org/上的DWARF规范,您将在该标准中找不到关于这个数字的任何内容--但是如果您编写了一个真正的DWARF解析器(而不是解释readelf输出的解析器或其他任何东西),您将在DWARF4规范的第2.3节(“调试信息条目的关系”)和第7.5.3节“缩略表”(DW_CHILDREN_yes或DW_CHILDREN_no)中看到这个主题。
https://stackoverflow.com/questions/16946281
复制相似问题