> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-fix-nav-issues.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> Документация по формату DWARF

# DWARF

| Ввод | Вывод | Псевдоним |
| ---- | ----- | --------- |
| ✔    | ✗     |           |

<div id="description">
  ## Описание
</div>

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

<Info>
  `.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`, представляющие методы класса.
</Info>

Формат `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` - строковое значение атрибута; пустая строка, если у атрибута нет строкового значения

<div id="example-usage">
  ## Пример использования
</div>

Формат `DWARF` можно использовать для поиска единиц компиляции, содержащих наибольшее число определений функций (включая инстанцирования шаблонов и функции из подключаемых файлов заголовков):

```sql title="Query" theme={null}
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
```

```text title="Response" theme={null}
┌─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.
```

<div id="format-settings">
  ## Настройки формата
</div>
