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

DWARF

输入输出别名

描述

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

信息

.debug_info单元组成,这些单元对应于编译单元

  • 每个单元都是一个 DIE 树,其中 compile_unit DIE 作为其根。
  • 每个 DIE 都有一个标签和一个属性列表。
  • 每个属性都有一个名称和一个(以及一个形式,用于指定值的编码方式)。

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

  • 函数(标签 = 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 平行
  • 为了方便起见,从属性数组中复制了一些常用属性
    • 名称
    • linkage_name - 经过 mangled 的完全限定名称;通常只有函数才有(但并非所有函数都有)
    • decl_file - 声明此实体的源代码文件名
    • decl_line - 声明此实体的源代码行号
  • 描述属性的并行数组
    • attr_name - 属性的名称;省略了传统的“DW_AT_”前缀
    • attr_form - 属性的编码和解释方式;省略了传统的 DW_FORM_ 前缀
    • attr_int - 属性的整数值;如果属性没有数值,则为 0
    • attr_str - 属性的字符串值;如果属性没有字符串值,则为空

示例用法

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

查询
SELECT
unit_name,
count() AS c
FROM file('programs/clickhouse', DWARF)
WHERE tag = 'subprogram' AND NOT has(attr_name, 'declaration')
GROUP BY unit_name
ORDER BY c DESC
LIMIT 3
响应
┌─unit_name──────────────────────────────────────────────────┬─────c─┐
│ ./src/Core/Settings.cpp │ 28939 │
│ ./src/AggregateFunctions/AggregateFunctionSumMap.cpp │ 23327 │
│ ./src/AggregateFunctions/AggregateFunctionUniqCombined.cpp │ 22649 │
└────────────────────────────────────────────────────────────┴───────┘

3 rows in set. Elapsed: 1.487 sec. Processed 139.76 million rows, 1.12 GB (93.97 million rows/s., 752.77 MB/s.)
Peak memory usage: 271.92 MiB.

格式设置