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
- 属性的整数值;如果属性没有数值,则为 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.