Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

DWARF

输入 输出 别名

描述

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 数组中额外列出的一些常见属性:
    • name
    • linkage_name - 名称修饰后的完全限定名;通常只有函数才有该属性 (但并非所有函数都有)
    • decl_file - 声明此实体的源代码文件名
    • decl_line - 声明此实体的源代码行号
  • 用于描述属性的并行数组:
    • attr_name - 属性名称;省略了惯用的 “DW_AT_” 前缀
    • attr_form - 属性的编码和解释方式;省略了惯用的 DW_FORM_ 前缀
    • attr_int - 属性的整数值;如果该属性没有数值,则为 0
    • attr_str - 属性的字符串值;如果该属性没有字符串值,则为空

示例用法

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

Querysql
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
Responsetext
┌─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.

格式设置

Navigation