反射函数
您可以使用本章中描述的函数来反射 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 向服务器日志发出追踪日志消息。
语法
参数
message
— 发送到服务器日志的消息。 String。
返回值
- 始终返回 0。
示例
查询:
结果: