探索 DWARF 调试格式信息
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_enumerato
r 表示其元素的信息。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 调试格式信息的更多相关文章
- DWARF调试格式的简介
DWARF调试格式的简介 Michael J. Eager, Eager Consulting Feb, 2007 翻译:吴晖 2012年2月 如果我们可以编写确保能正确工作且永远不需要调试的程序,这 ...
- 一次查找Windows Live Writer的VSPaste插件丢失RTF格式信息的经历
背景 我在博客园上写博客是使用Windows Live Writer,代码高亮插件是使用Paste from Visual Studio(下文简称VSPaste). Windows Live Writ ...
- linu查看系统用户与显示命令行提示符格式信息
目录 一:查看系统用户whoami 二:显示命令行提示符格式信息变量 一:查看系统用户whoami whoami : 当前窗口登录的用户 who : 当前用户登录系统的终端 作用: 显示当前用户登录了 ...
- dwarf调试信息格式入门
https://www.prevanders.net/dwarf.html#testingcomment http://www.dwarfstd.org/ http://www.cnblogs.com ...
- Android将应用调试log信息保存在SD卡
转载:http://blog.csdn.net/way_ping_li/article/details/8487866 把自己应用的调试信息写入到SD卡中. package com.sdmc.hote ...
- JQuery.Ajax之错误调试帮助信息
下面是Jquery中AJAX参数详细列表: 参数名 类型 描述 url String (默认: 当前页地址) 发送请求的地址. type String (默认: "GET") 请求 ...
- 转:JQuery.Ajax之错误调试帮助信息
今天发现一篇讲Ajax比较好的文章,汇总下,作为自己的知识储备. 下面是Jquery中AJAX参数详细列表: 参数名 类型 描述 url String (默认: 当前页地址) 发送请求的地址. typ ...
- [转]JQuery.Ajax之错误调试帮助信息
下面是Jquery中AJAX参数详细列表: 参数名 类型 描述 url String (默认: 当前页地址) 发送请求的地址. type String (默认: "GET") 请求 ...
- JQuery.Ajax之错误调试帮助信息介绍
下面是Jquery中AJAX参数详细列表: timeout Number 设置请求超时时间(毫秒).此设置将覆盖全局设置. async Boolean (默认: true) 默认设置下,所有请求均为异 ...
随机推荐
- C# 插件热插拔 .NET:何时应该 “包装异常”? log4.net 自定义日志文件名称
C# 插件热插拔 所谓热插拔就是插件可以 在主程序不重新启动的情况直接更新插件, 网上有很多方案: https://www.cnblogs.com/happyframework/p/3405811 ...
- android学习一(了解android)
声明:android学习文件中面的全部内容为都是整理来自第一行代码Android.在接下来的文章里我就不在进行反复的声明. 想看原版的能够买书看看.或者去作者的博客http://blog.csdn.n ...
- LiveWriter高亮显示方法专题
2013年9月26日 花了一上午的时间,熟悉了LiveWriter的用法,学会了怎么配置语法高亮,总结下来. 方法1.用博客园推荐的方法没有成功.pass 方法2 方法来自一个人的旅行.试过O ...
- web 开发之js---js 实现网页中播放wav的一种方法(flash播放器)
http://blog.csdn.net/whumr1/article/details/6948160
- 基于Canvas的Char.js库使用
Chart.js是基于Html5 Canvas的图表库. 官网:http://www.chartjs.org/ 參考文档:http://www.chartjs.org/docs/ 支持六种图表,相应源 ...
- ARP协议(4)ARP编程
之前的几篇文章,分别介绍了 ARP 协议格式,在vs2012里配置winpcap环境,我们该做的准备都已经做完了.如今我们真正来实现了. 一.定义数据结构 依据ARP的协议格式,设计一个ARP协议格式 ...
- ios27--kvo
// // ViewController.h // 14-KVO的使用 #import <UIKit/UIKit.h> @interface ViewController : UIView ...
- java获取本周 上周的所有日期
1 根据当前日期获得所在周的日期区间(周一和周日日期) public String getTimeInterval(Date date) { Calendar cal = Calendar.getIn ...
- POJ1912 A highway and the seven dwarfs (判断凸包与直线相交 logn)
POJ1912 给定n个点 和若干条直线,判断对于一条直线,是否存在两个点在直线的两侧. 显然原命题等价于 凸包与直线是否相交. O(n)的算法是显而易见的 但是直线数量太多 就会复杂到O(n^2)由 ...
- mldonkey设置!看图(转载)
转自:http://www.nenew.net/ubuntu-mldonkey-application.html 这里不是争论区,amule和mldonkey各有各好,看个人爱好,没有高下,都是程序员 ...