Перейти к основному содержанию
ВводВыводПсевдоним

Описание

Формат DWARF разбирает отладочные символы DWARF из ELF-файла (исполняемого файла, библиотеки или объектного файла). Он похож на dwarfdump, но работает значительно быстрее (сотни МБ/с) и поддерживает SQL. Он создаёт одну строку для каждой записи Debug Information Entry (DIE) в секции .debug_info и включает записи null, которые кодировка DWARF использует для завершения списков дочерних элементов в дереве.
.debug_info состоит из единиц, соответствующих единицам компиляции:
  • Каждая единица представляет собой дерево из DIE, корнем которого является DIE compile_unit.
  • У каждого DIE есть tag и список атрибутов.
  • У каждого атрибута есть name и value (а также form, который задаёт способ кодирования значения).
DIE представляют сущности исходного кода, а их tag указывает, что именно это за сущность. Например, это могут быть:
  • функции (tag = subprogram)
  • классы/структуры/перечисления (class_type/structure_type/enumeration_type)
  • переменные (variable)
  • аргументы функции (formal_parameter).
Структура дерева отражает структуру соответствующего исходного кода. Например, DIE class_type может содержать DIE subprogram, представляющие методы класса.
Формат 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
  • несколько распространённых атрибутов, продублированных из массива атрибутов для удобства:
    • name
    • linkage_name - манглированное полное квалифицированное имя; обычно есть только у функций (но не у всех)
    • decl_file - имя файла исходного кода, где была объявлена эта сущность
    • decl_line - номер строки в исходном коде, где была объявлена эта сущность
  • параллельные массивы, описывающие атрибуты:
    • attr_name - имя атрибута; общепринятый префикс “DW_AT_” опущен
    • attr_form - способ кодирования и интерпретации атрибута; общепринятый префикс DW_FORM_ опущен
    • attr_int - целочисленное значение атрибута; 0, если у атрибута нет числового значения
    • attr_str - строковое значение атрибута; пустая строка, если у атрибута нет строкового значения

Пример использования

Формат DWARF можно использовать для поиска единиц компиляции, содержащих наибольшее число определений функций (включая инстанцирования шаблонов и функции из подключаемых файлов заголовков):
Query
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
Response
┌─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.)
Пиковое потребление памяти: 271.92 MiB.

Настройки формата

Последнее изменение 10 июня 2026 г.