首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++ dwarf标签编号格式

c++ dwarf标签编号格式
EN

Stack Overflow用户
提问于 2013-06-06 01:31:32
回答 1查看 635关注 0票数 0

考虑下面的dwarf代码示例-

代码语言:javascript
复制
<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中找不到任何关于它的东西。作为参考,以下是原始程序-

代码语言:javascript
复制
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;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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_yesDW_CHILDREN_no)中看到这个主题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16946281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档