探索 DWARF 调试格式信息

探索 DWARF 调试格式信息https www ibm com developerwor cn aix library au dwarf debug format index html 简介 DWARF 使用有属性的记录格式进行调试 是许多编译程序和调试程序所使用的一种调试文件格式 可以支持源代码级的调试 它是对象文件内的调试信息的格式 程序的 DWARF 描述是一个树形结构 每个节点都可以有子节点或兄弟节点

https://www.ibm.com/developerworks/cn/aix/library/au-dwarf-debug-format/index.html

简介

DWARF(使用有属性的记录格式进行调试 )是许多编译程序和调试程序所使用的一种调试文件格式,可以支持源代码级的调试。它是对象文件内的调试信息的格式。程序的 DWARF 描述是一个树形结构,每个节点都可以有子节点或兄弟节点。节点可能代表类型、变量或函数。

DWARF 使用一系列的调试信息条目(DIE)来定义源程序的一个低级表示。每个调试信息条目由一个识别标记和一系列属性组成。条目或条目组提供了在源程序中的相应实体的描述。标记指定了条目所属的类,而属性定义了条目的具体特点。

DWARF 部分

组成 DWARF 数据的不同 DWARF 部分如下:

数据列 信息说明
.debug_loc DW_AT_location 属性中使用的位置列表
.debug_macinfo 宏信息
.debug_pubnames 全局对象和函数的查找表
.debug_pubtypes 全球类型的查找表
.debug_ranges DW_AT_ranges 属性中使用的地址范围
.debug_str .debug_info 中使用的字符串表
.debug_types 类型描述

.debug_abbrev 部分包含 DWARF 编译的所编译单元的缩写表。单个编译单元的缩写表包含一系列的缩写声明。每个声明都为一个特定的调试信息条目指定了标记和属性。缩写表中的相应条目会帮助您找到直接包含在 .debug_info 部分中的信息的解释。.debug_info 部分包含符号的原始信息。每个编译单元都与一个特定的缩写表关联,但多个编译单元可以共享同一个表。

DWARF 表示

有一些获得了许可的工具,比如 readelf、dwarfdumplibdwarf,它们可用于读取 DWARF 信息。脚本或程序可以读取这些工具的输出,以查找和解释所需的信息。重要的是知道编写此类脚本的标记和属性定义。

常用的标记和属性

下面的列表显示了在调试 C++ 应用程序时最受关注的标记。

数据列 信息说明
DW_TAG_class_type 表示类名称和类型信息
DW_TAG_structure_type 表示结构名称和类型信息
DW_TAG_union_type 表示联合名称和类型信息
DW_TAG_enumeration_type 表示联合名称和类型信息
DW_TAG_typedef 表示 typedef 名称和类型信息
DW_TAG_array_type 表示数组名称和类型信息
DW_TAG_subrange_type 表示数组大小信息
DW_TAG_inheritance 表示继承的类名称和类型信息
DW_TAG_member 表示类的成员
DW_TAG_subprogram 表示函数名称信息
DW_TAG_formal_parameter 表示函数参数的信息
DW_AT_name 表示名称字符串
DW_AT_type 表示类型信息
DW_AT_artificial 在创建时由编译程序设置
DW_AT_sibling 表示兄弟位置信息
DW_AT_data_member_location 表示位置信息
DW_AT_virtuality 在虚拟时设置

DWARF 信息

通过下面的命令,使用 XLC 编译程序以 DWARF 格式编译一个程序。

1

/usr/vacpp/bin/xlC -g -qdbgfmt=dwarf -o test test.C

图 1. 样例测试程序

样例测试程序

上面示例中的 dwarfdump 输出可以使用以下方式进行解释。

编译单元

DW_TAG_compile_unit.debug_abbrev 部分如图 2 所示。

图 2. .debug_abbrev 部分

.debug_abbrev 部分

DW_TAG_* 后面通常是 DW_CHILDREN_* 和一系列属性 (DW_AT_*)(DW_FORM_*) 格式DW_CHILDREN_* 是一个单字节的值,用于确定使用此缩写的调试信息条目是否有子条目。如果该值是 DW_CHILDREN_yes,那么使用此缩写的任何调试信息条目的下一个物理继承条目应该是该条目的第一个子条目。如果后跟缩写词的标签编码的单字节的值是 DW_CHILDREN_no,那么使用此缩写的任何调试信息条目的下一个物理继承条目应该是该条目的第一个兄弟条目。每个兄弟条目链都用一个空条目来终止。

图 3. .debug_info 部分中的 DW_TAG_compile_unit

.debug_info 部分中的 DW_TAG_compile_unit

DW_FORM_* 属性指定了读取 .debug_info 部分中的 DW_AT* 的方式。在本例中,DW_AT_name 是字符串形式的。所以 DW_TAG_compile_unit 的第一个属性必须是作为 .debug_info 部分中的一个字符串(即 test.C)进行处理的。

  • 文件类型是 C_plus_plus,它位于 /home/raji。
  • 文件是使用 IBM XL C/C++ v12 编译的。

提取类信息

  • DW_TAG_class_type – 表示类名称和类型信息
  • DW_TAG_member – 表示类的成员

图 4. 类名称和成员信息

类名称和成员信息

图 4 说明:

  • 有一个数据类型,名为 int,大小为 4 个字节。
  • 有一个类,名为 base,大小为 4 个字节,其兄弟条目的位置是 <126>
  • 有一个类成员,名称为 basemember。此成员的类型的位置是 <82>,即 int。范围是 public,它位于从类的起点开始的第 0 个位置。

提取数组大小

DW_TAG_array_type 的直接子条目是 DW_TAG_subrange_type,它包含数组大小。数组大小的计算方法是 (DW_AT_upper_bound DW_AT_lower_bound) +1。如果该数组是一个二维数组,则会再次出现类型为 DW_TAG_subrange_type 的直接兄弟条目。在本例中,数组的大小是 8(7+1)。

图 5. 数组大小

数组大小

提取函数名称和参数

  • DW_TAG_subprogram - 表示函数名称信息
  • DW_TAG_formal_parameter- 表示函数参数的信息

图 6. 函数名称

函数名称

图 7. 函数参数

函数参数

图 7 说明:

  • 有一个函数,名为 display,范围是 public,其兄弟条目位于 <332>
  • 处理过后的名称(mangled name)是 display__7myclassFi
  • 函数的第一个参数是 这种。它被编译程序创建为 DW_AT_artificial,并被设置为 yes,其类型位于 <421>,类型为 myclass
  • 第二个参数的名称是 x,类型在位置 <82> 上,类型为 int

提取 typedef

DW_TAG_typedef 表示 typedef 名称和类型信息。

图 8. typedef

typedef

从图 8 中,我们可以了解到,有一个 typedef 条目,名称为 int_type,其类型在位置 <82> 上,类型为 int

提取枚举信息

  • DW_TAG_enumeration_type 包括枚举 名称,DW_TAG_enumerator 表示其元素的信息。
  • DW_AT_const_value 指定了分配给元素的值。

图 9. 枚举值

枚举值

图 9 说明:

  • myenumenum 的名称,其大小为 4 个字节。
  • Jan 是第一个元素,其值是 1
  • Feb 是第二个元素,其值是 2

提取继承信息

DW_TAG_inheritance 表示继承的类名称和类型信息。

图 10. 继承

继承

图 10 说明:

  • 有一个派生的类,名称为 myclass,大小为 24 个字节。
  • 基类在位置 94. 上,其名称为 base
  • DW_VIRTUALITY_none 属性指定它是一个非虚拟类。

相关主题

  • 阅读有关 DWARF 调试标准的更多信息。
  • DWARF 调试格式简介。
  • AIX and UNIX 专区:developerWorks 的“AIX and UNIX 专区”提供了大量与 AIX 系统管理的所有方面相关的信息,您可以利用它们来扩展自己的 UNIX 技能。
  • AIX and UNIX 专题汇总:AIX and UNIX 专区已经为您推出了很多的技术专题,为您总结了很多热门的知识点。我们在后面还会继续推出很多相关的热门专题给您,为了方便您的访问,我们在这里为您把本专区的所有专题进行汇总,让您更方便的找到您需要的内容。
  • AIX and UNIX 下载中心:在这里你可以下载到可以运行在 AIX 或者是 UNIX 系统上的 IBM 服务器软件以及工具,让您可以提前免费试用他们的强大功能。
  • IBM Systems Magazine for AIX 中文版:本杂志的内容更加关注于趋势和企业级架构应用方面的内容,同时对于新兴的技术、产品、应用方式等也有很深入的探讨。IBM Systems Magazine 的内容都是由十分资深的业内人士撰写的,包括 IBM 的合作伙伴、IBM 的主机工程师以及高级管理人员。所以,从这些内容中,您可以了解到更高层次的应用理念,让您在选择和应用 IBM 系统时有一个更好的认识。

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/232001.html原文链接:https://javaforall.net

(0)
上一篇 2025年11月8日 上午9:01
下一篇 2025年11月8日 上午9:22


相关推荐

  • windows下常见php集成环境安装包介绍(updated)

    windows下常见php集成环境安装包介绍(updated)windows下常见php集成环境安装包介绍(updated)September4,2010 |作者:猪肉有毒   WAMP是指在Windows服务器上使用Apache、MySQL和PHP的集成安装环境,可以快速安装配置Web服务器,一般说来,大家都习惯于将Apache、MySQL、PHP架设在Linux系统下,但是,不可否认的是Windows也有其优点,就是易用,

    2022年6月28日
    28
  • OllyDbg使用教程[通俗易懂]

    OllyDbg使用教程[通俗易懂]一、OllyDbg获取OllyDbg目前官方已经停止维护,各大论坛针对OllyDbg出了定制版,主要是对的插件进行了集成,比较出名的是“吾爱激活成功教程专用版Ollydbg”。同时还有OllyICE,也是由一些爱好者对OllyDBG修改,新增一些功能或修正一些bug而形成的一个版本。可以从此处下载获取:http://download.csdn.net/download/china_jeffery/…

    2025年8月13日
    7
  • 测试用例八大要素有哪些?

    测试用例八大要素有哪些?测试用例八大要素:用例编号、操作步骤、测试标题、重要级别、前置条件、测试输入、所属模块、预期结果。用例编号由字符串组成,具有易于识别性和唯一性;操作步骤需要标明详细的测试步骤;测试标题需要简洁、明了;重要级别一般分为高、中、低;前置条件就是进行测试用例的前提条件;测试输入包括用户名、密码、订单号等内容;所属模块标明被测试的模块或者单元;预期结果表示预期输出的结果。测试用例很重要,是设计和测试过程的基础,同时测试用例也是软件测试的核心,可以发现软件可能出现的bug,一般每个软件产品都有与之对应的测试用

    2022年6月28日
    101
  • Django模糊查询「建议收藏」

    Django模糊查询「建议收藏」本文介绍了Django中的单子段和多字段联合的模糊查询

    2022年5月30日
    35
  • 订单支付[通俗易懂]

    订单支付[通俗易懂]前言文章中的图片和在摘录不是来自一篇文章,所以细节不是完全对应。可借鉴的是开发的思路:从整体的功能模块的使用; 到核心流程; 到系统实现的架构; 再到代码流程(可以采用序列图)。前两点是业务需求,后两点是功能实现。支付系统的作用https://www.cnblogs.com/veblen/p/10992167.html核心流程http://www….

    2022年5月3日
    49
  • idea2021.7.15版激活码【中文破解版】[通俗易懂]

    (idea2021.7.15版激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlMLZPB5EL5Q-eyJsaWNlbnNlSW…

    2022年3月21日
    56

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号