自省函数
您可以使用本章中描述的函数来自省 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 函数允许通过 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) — 正在运行的进程中的指令地址。
返回值
示例
启用自省函数:
选择 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 向服务器日志发出trace日志消息。
语法
参数
message
— 发往服务器日志的消息。String。
返回值
- 始终返回 0。
示例
查询:
结果:
mergeTreePartInfo
函数帮助从 MergeTree
部件名称中提取有用值。
语法
参数
part_name
(String) — 要解包的部分的名称。
返回值
- Tuple 具有子列:
partition_id
min_block
max_block
level
mutation
示例
查询:
结果:
isMergeTreePartCoveredBy
检查第一个参数的部分是否被第二个参数的部分覆盖的函数。
语法
参数
返回值
- 如果它覆盖,则返回 1,否则返回 0。
示例
查询:
结果: