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

内省函数

您可以使用本章中描述的函数来检查 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 字段包含采样时的堆栈跟踪。

获取单个地址的源代码文件名和行号:

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

Note: arrayMap 函数允许通过 addressToLine 函数处理 trace 数组的每个单独元素。您可以在输出的 trace_source_code_lines 列中看到该处理的结果。

addressToLineWithInlines

类似于 addressToLine,但返回一个包含所有内联函数的数组。因此,其速度比 addressToLine 慢。

备注

如果您使用的是官方 ClickHouse 包,则需要安装 clickhouse-common-static-dbg 包。

语法

参数

  • address_of_binary_instruction (UInt64) — 运行中进程中的指令地址。

返回值

  • 一个数组,数组的第一个元素是源代码文件名和行号,格式为冒号分隔。从第二个元素开始,列出内联函数的源代码文件名、行号和函数名。如果该函数无法找到调试信息,则返回一个仅包含二进制名称的数组;如果地址无效,则返回空数组。Array(String)

示例

启用内省函数:

将该函数应用于地址。

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

Note: arrayJoin 函数将数组拆分为行。

addressToSymbol

将 ClickHouse 服务器进程中的虚拟内存地址转换为 ClickHouse 对象文件中的符号。

语法

参数

  • address_of_binary_instruction (UInt64) — 运行中进程中的指令地址。

返回值

  • 来自 ClickHouse 对象文件的符号。String
  • 如果地址无效,则返回空字符串。String

示例

启用内省函数:

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

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

获取单个地址的符号:

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

Note: arrayMap 函数允许通过 addressToSymbols 函数处理 trace 数组的每个单独元素。您可以在输出的 trace_symbols 列中看到该处理的结果。

demangle

将您可以使用 addressToSymbol 函数获取的符号转换为 C++ 函数名。

语法

参数

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

返回值

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

示例

启用内省函数:

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

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

获取单个地址的函数名:

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

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

tid

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

语法

返回值

示例

查询:

结果:

logTrace

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

语法

参数

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

返回值

  • 总是返回 0。

示例

查询:

结果: