跳到主要内容
跳到主要内容

自省函数

您可以使用本章中描述的函数来自省 ELFDWARF 以进行查询分析。

备注

这些函数速度较慢,并可能存在安全隐患。

为了使自省函数正常工作:

  • 安装 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 函数允许通过 addressToLine 函数处理 trace 数组中的每个单独元素。您可以在输出的 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 函数允许通过 addressToSymbols 函数处理 trace 数组中的每个单独元素。您可以在输出的 trace_symbols 列中看到此处理的结果。

demangle

将您可以通过 addressToSymbol 函数获取的符号转换为 C++ 函数名称。

语法

参数

  • symbol (String) — 来自对象文件的符号。

返回值

  • C++ 函数的名称,或者如果符号无效则返回空字符串。String

示例

启用自省函数:

选择 trace_log 系统表中的第一条字符串:

trace 字段包含采样时的堆栈跟踪。

获取单个地址的函数名称:

将该函数应用于整个堆栈跟踪:

arrayMap 函数允许通过 demangle 函数处理 trace 数组中的每个单独元素。您可以在输出的 trace_functions 列中看到此处理的结果。

tid

返回当前处理的 Block 的线程 id。

语法

返回值

示例

查询:

结果:

logTrace

为每个 Block 向服务器日志发出trace日志消息。

语法

参数

  • message — 发往服务器日志的消息。String

返回值

  • 始终返回 0。

示例

查询:

结果:

mergeTreePartInfo

函数帮助从 MergeTree 部件名称中提取有用值。

语法

参数

  • part_name (String) — 要解包的部分的名称。

返回值

  • Tuple 具有子列:
    • partition_id
    • min_block
    • max_block
    • level
    • mutation

示例

查询:

结果:

isMergeTreePartCoveredBy

检查第一个参数的部分是否被第二个参数的部分覆盖的函数。

语法

参数

  • nested_part (String) — 预期嵌套部分的名称。
  • covering_part (String) — 预期覆盖部分的名称。

返回值

  • 如果它覆盖,则返回 1,否则返回 0。

示例

查询:

结果: