| 输入 | 输出 | 别名 |
|---|---|---|
| ✔ | ✗ |
描述
DWARF 格式可从 ELF 文件 (可执行文件、库或目标文件) 中解析 DWARF 调试符号。
它与 dwarfdump 类似,但速度要快得多 (可达数百 MB/s) ,并且支持 SQL。
它会为 .debug_info 部分中的每个调试信息条目 (DIE) 生成一行,
并包含 DWARF 编码中用于终止树状子节点列表的 “null” 条目。
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一一对应- 为方便使用,从 attributes 数组中额外列出的一些常见属性:
namelinkage_name- 名称修饰后的完全限定名;通常只有函数才有该属性 (但并非所有函数都有)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.