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

简介

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、dwarfdump 和 libdwarf,它们可用于读取 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 部分

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

图 3. .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

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

提取枚举信息

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

图 9 说明:

  • myenum 是 enum 的名称,其大小为 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 系统时有一个更好的认识。

探索 DWARF 调试格式信息的更多相关文章

  1. DWARF调试格式的简介

    DWARF调试格式的简介 Michael J. Eager, Eager Consulting Feb, 2007 翻译:吴晖 2012年2月 如果我们可以编写确保能正确工作且永远不需要调试的程序,这 ...

  2. 一次查找Windows Live Writer的VSPaste插件丢失RTF格式信息的经历

    背景 我在博客园上写博客是使用Windows Live Writer,代码高亮插件是使用Paste from Visual Studio(下文简称VSPaste). Windows Live Writ ...

  3. linu查看系统用户与显示命令行提示符格式信息

    目录 一:查看系统用户whoami 二:显示命令行提示符格式信息变量 一:查看系统用户whoami whoami : 当前窗口登录的用户 who : 当前用户登录系统的终端 作用: 显示当前用户登录了 ...

  4. dwarf调试信息格式入门

    https://www.prevanders.net/dwarf.html#testingcomment http://www.dwarfstd.org/ http://www.cnblogs.com ...

  5. Android将应用调试log信息保存在SD卡

    转载:http://blog.csdn.net/way_ping_li/article/details/8487866 把自己应用的调试信息写入到SD卡中. package com.sdmc.hote ...

  6. JQuery.Ajax之错误调试帮助信息

    下面是Jquery中AJAX参数详细列表: 参数名 类型 描述 url String (默认: 当前页地址) 发送请求的地址. type String (默认: "GET") 请求 ...

  7. 转:JQuery.Ajax之错误调试帮助信息

    今天发现一篇讲Ajax比较好的文章,汇总下,作为自己的知识储备. 下面是Jquery中AJAX参数详细列表: 参数名 类型 描述 url String (默认: 当前页地址) 发送请求的地址. typ ...

  8. [转]JQuery.Ajax之错误调试帮助信息

    下面是Jquery中AJAX参数详细列表: 参数名 类型 描述 url String (默认: 当前页地址) 发送请求的地址. type String (默认: "GET") 请求 ...

  9. JQuery.Ajax之错误调试帮助信息介绍

    下面是Jquery中AJAX参数详细列表: timeout Number 设置请求超时时间(毫秒).此设置将覆盖全局设置. async Boolean (默认: true) 默认设置下,所有请求均为异 ...

随机推荐

  1. Android.mk文件解析

     一.一个简单的Android.mk文件例如以下: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := nativ ...

  2. jqury-validate表单验证

    首先需要引入插件:jquery.validate.js这个插件. 然后对需要验证的表单实现js: $("#add-firewalls-form").validate({ submi ...

  3. UNION(并集)集合运算

    在集合论中,两个集合(记为集合A和B)的并集是一个包含集合A和B中所有元素的集合.换句话说,如果一个元素属于任何一个输入集合,那么它也属于结果集. 在T-SQL中,UNION 集合运算可以将两个输入查 ...

  4. Cocos2D-X2.2.3学习笔记12(瞬时动作)

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVjYmxvZw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...

  5. 黑马day13 分页思路&amp;实现

    分页的总体思想: 分页包含什么: 1.当前页,每页显示的记录数,总的记录数,总的页码,集合List存放的是JavaBean,首页, 尾页,上一页,下一页 传递的參数:当前页,每页显示的记录数.这两个本 ...

  6. grep结合awk简单用法

    一.grep简介: grep (缩写来自Globally search a Regular Expression and Print)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行 ...

  7. Appro DM8127 IPNC 挂载NFS遇到的问题及解决

    对于Appro DM8127 IPNC,默认的启动方式是NAND is used for booting kernel and NAND is used as root filesystem 为了调试 ...

  8. 千万数据条 用户特征数据 写入mysql

    from mysql_tool import * import copy s = ''' INSERT INTO `qqzone`.`myu` (`id`, `uid`, `age`, `gender ...

  9. iOS开发系列- 视频MPMoviePlayerController

    MPMoviePlayerController 在iOS中播放视频可以使用MediaPlayer.framework种的MPMoviePlayerController类来完成,它支持本地视频和网络视频 ...

  10. [译]NUnit--Installation(三)

    Installation NUnit安装程序默认安装文件路径为C:\Program Files\NUnit 2.6.2.根据用户选择安装的选项,安装文件有三个子文件夹:bin.doc.samples. ...