DWARF
| 输入 | 输出 | 别名 |
|---|---|---|
| ✔ | ✗ |
描述
DWARF 格式从 ELF 文件(可执行文件、库文件或目标文件)解析 DWARF 调试符号。它类似于 dwarfdump,但速度更快(数百 MB/s)并支持 SQL。它为 .debug_info 部分中的每个调试信息条目 (DIE) 生成一行,并包含 DWARF 编码用于终止树中子列表的“null”条目。
信息
.debug_info 由单元组成,这些单元对应于编译单元
- 每个单元都是一个 DIE 树,其中
compile_unitDIE 作为其根。 - 每个 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- 属性的整数值;如果属性没有数值,则为 0attr_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.