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

反射函数

您可以使用本章中描述的函数来反射 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。

语法

返回值

  • 当前线程 ID。 Uint64

示例

查询:

结果:

logTrace

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

语法

参数

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

返回值

  • 始终返回 0。

示例

查询:

结果: