Перейти к основному содержимому
Перейти к основному содержимому

DWARF

InputOutputAlias

Описание

Формат DWARF разбирает символы отладки DWARF из ELF-файла (исполняемый файл, библиотека или объектный файл). Он аналогичен dwarfdump, но гораздо быстрее (сотни МБ/с) и поддерживает SQL. Он генерирует одну строку для каждой записи отладочной информации (DIE) в разделе .debug_info и включает "нулевые" записи, которые закодировка DWARF использует для завершения списков дочерних элементов в дереве.

к сведению

.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
  • несколько общих атрибутов, дублированных из массива атрибутов для удобства:
    • name
    • linkage_name - искаженное полное имя; обычно только функции имеют это (но не все функции)
    • decl_file - имя исходного файла, в котором этот элемент был объявлен
    • decl_line - номер строки в исходном коде, где этот элемент был объявлен
  • параллельные массивы, описывающие атрибуты:
    • attr_name - имя атрибута; обычный префикс "DW_AT_" опускается
    • attr_form - как атрибут закодирован и интерпретируется; обычный префикс DW_FORM_ опускается
    • attr_int - целочисленное значение атрибута; 0, если атрибут не имеет числового значения
    • attr_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.

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