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

Функции интроспекции

Вы можете использовать функции, описанные в этой главе, для интроспекции ELF и DWARF для профилирования запросов.

примечание

Эти функции медленные и могут создавать проблемы с безопасностью.

Для правильной работы функций интроспекции:

  • Установите пакет clickhouse-common-static-dbg.

  • Установите настройку allow_introspection_functions в 1.

    По соображениям безопасности функции интроспекции по умолчанию отключены.

ClickHouse сохраняет отчеты профилировщика в системной таблице trace_log. Убедитесь, что таблица и профилировщик настроены правильно.

addressToLine

Преобразует виртуальный адрес памяти внутри процесса сервера ClickHouse в имя файла и номер строки в исходном коде ClickHouse.

Если вы используете официальные пакеты ClickHouse, вам нужно установить пакет clickhouse-common-static-dbg.

Синтаксис

Аргументы

  • address_of_binary_instruction (UInt64) — Адрес инструкции в запущенном процессе.

Возвращаемое значение

  • Имя файла исходного кода и номер строки в этом файле, разделенные двоеточием. Например, /build/obj-x86_64-linux-gnu/../src/Common/ThreadPool.cpp:199, где 199 — это номер строки.
  • Имя бинарного файла, если функция не смогла найти отладочную информацию.
  • Пустая строка, если адрес недействителен.

Тип: String.

Пример

Включение функций интроспекции:

Выбор первой строки из системной таблицы trace_log:

Поле trace содержит трассировку стека в момент выборки.

Получение имени файла исходного кода и номера строки для одного адреса:

Применение функции ко всей трассировке стека:

Функция arrayMap позволяет обрабатывать каждый отдельный элемент массива trace с помощью функции addressToLine. Результат этой обработки вы видите в столбце trace_source_code_lines вывода.

addressToLineWithInlines

Аналогично addressToLine, но возвращает массив со всеми встроенными функциями. Как следствие, он медленнее, чем addressToLine.

примечание

Если вы используете официальные пакеты ClickHouse, вам нужно установить пакет clickhouse-common-static-dbg.

Синтаксис

Аргументы

  • address_of_binary_instruction (UInt64) — Адрес инструкции в запущенном процессе.

Возвращаемое значение

  • Массив, первый элемент которого — это имя файла исходного кода и номер строки в файле, разделенные двоеточием. Начиная со второго элемента, перечислены имена файлов исходного кода автоматически встроенных функций, номера строк и названия функций. Если функция не смогла найти отладочную информацию, возвращается массив с единственным элементом, равным имени бинарного файла, в противном случае возвращается пустой массив, если адрес недействителен. Array(String).

Пример

Включение функций интроспекции:

Применение функции к адресу.

Применение функции ко всей трассировке стека:

Функции arrayJoin разобьют массив на строки.

addressToSymbol

Преобразует виртуальный адрес памяти внутри процесса сервера ClickHouse в символ из объектных файлов ClickHouse.

Синтаксис

Аргументы

  • address_of_binary_instruction (UInt64) — Адрес инструкции в запущенном процессе.

Возвращаемое значение

  • Символ из объектных файлов ClickHouse. String.
  • Пустая строка, если адрес недействителен. String.

Пример

Включение функций интроспекции:

Выбор первой строки из системной таблицы trace_log:

Поле trace содержит трассировку стека в момент выборки.

Получение символа для одного адреса:

Применение функции ко всей трассировке стека:

Функция arrayMap позволяет обрабатывать каждый отдельный элемент массива trace с помощью функции addressToSymbols. Результат этой обработки вы видите в столбце trace_symbols вывода.

demangle

Преобразует символ, который вы можете получить с помощью функции addressToSymbol, в имя функции C++.

Синтаксис

Аргументы

  • symbol (String) — Символ из объектного файла.

Возвращаемое значение

  • Имя C++ функции или пустая строка, если символ недействителен. String.

Пример

Включение функций интроспекции:

Выбор первой строки из системной таблицы trace_log:

Поле trace содержит трассировку стека в момент выборки.

Получение имени функции для одного адреса:

Применение функции ко всей трассировке стека:

Функция arrayMap позволяет обрабатывать каждый отдельный элемент массива trace с помощью функции demangle. Результат этой обработки вы видите в столбце trace_functions вывода.

tid

Возвращает идентификатор потока, в котором обрабатывается текущий Block.

Синтаксис

Возвращаемое значение

  • Текущий идентификатор потока. Uint64.

Пример

Запрос:

Результат:

logTrace

Отправляет сообщение трассировки в лог сервера для каждого Block.

Синтаксис

Аргументы

  • message — Сообщение, которое отправляется в лог сервера. String.

Возвращаемое значение

  • Всегда возвращает 0.

Пример

Запрос:

Результат: