跳到主要内容
跳到主要内容

DWARF

输入输出别名

描述

DWARF 格式解析来自 ELF 文件(可执行文件、库或对象文件)的 DWARF 调试符号。 它与 dwarfdump 类似,但速度更快(每秒数百 MB)且支持 SQL。 它为 .debug_info 部分中每个调试信息条目(DIE)生成一行,并包括 DWARF 编码用于终止树中子项列表的“null”条目。

信息

.debug_info 由与编译单元对应的 units 组成:

  • 每个单元是 DIE 的树,其根是 compile_unit DIE。
  • 每个 DIE 具有一个 tag 和一个 attributes 列表。
  • 每个属性都有一个 name 和一个 value(还有一个 form,指定值的编码方式)。

DIE 表示源代码中的事物,其 tag 告诉你它是什么类型的事物。例如,有:

  • 函数(tag = subprogram
  • 类/结构体/枚举(class_type/structure_type/enumeration_type
  • 变量(variable
  • 函数参数(formal_parameter)。

树结构与相应的源代码镜像。例如,class_type DIE 可以包含 subprogram DIE,表示该类的方法。

DWARF 格式输出以下列:

  • offset - DIE 在 .debug_info 部分中的位置
  • size - 编码的 DIE 中的字节数(包括属性)
  • tag - DIE 的类型;省略常规的 "DW_TAG_" 前缀
  • unit_name - 包含该 DIE 的编译单元名称
  • unit_offset - 包含该 DIE 的编译单元在 .debug_info 部分中的位置
  • ancestor_tags - 当前 DIE 在树中父项的标签数组,按从内到外的顺序
  • ancestor_offsets - 与 ancestor_tags 平行的父项偏移量
  • 为方便起见,从属性数组中重复的几个常见属性:
    • name
    • linkage_name - 加工过的完整限定名;通常只有函数具有它(但不是所有函数)
    • decl_file - 声明此实体的源代码文件名称
    • decl_line - 声明此实体的源代码中的行号
  • 描述属性的平行数组:
    • attr_name - 属性名称;省略常规的 "DW_AT_" 前缀
    • attr_form - 属性的编码和解释方式;省略常规 DW_FORM_ 前缀
    • attr_int - 属性的整数值;如果属性没有数值,则为 0
    • attr_str - 属性的字符串值;如果属性没有字符串值,则为空

示例用法

DWARF 格式可用于查找具有最多函数定义的编译单元(包括模板实例和来自包含头文件的函数):

格式设置