内省函数
您可以使用本章中描述的函数来检查 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
字段包含采样时的堆栈跟踪。
获取单个地址的源代码文件名和行号:
将该函数应用于整个堆栈跟踪:
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) — 运行中进程中的指令地址。
返回值
示例
启用内省函数:
从 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。
语法
返回值
- 当前线程 ID。Uint64。
示例
查询:
结果:
logTrace
为每个 Block 向服务器日志发出跟踪日志消息。
语法
参数
message
— 发出到服务器日志的消息。String。
返回值
- 总是返回 0。
示例
查询:
结果: