Introspection Functions
この章で説明する関数を使用して、クエリプロファイリングのために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関数は、trace
配列の各個別の要素をaddressToLine
関数で処理することを可能にします。この処理の結果は出力のtrace_source_code_lines
カラムに表示されます。
addressToLineWithInlines
addressToLine
に似ていますが、すべてのインライン関数を含む配列を返します。この結果、addressToLine
よりも遅くなります。
公式のClickHouseパッケージを使用する場合は、clickhouse-common-static-dbg
パッケージをインストールする必要があります。
構文
引数
address_of_binary_instruction
(UInt64) — 実行中のプロセスにおける命令のアドレス。
戻り値
- 最初の要素はコロンで区切られたソースコードファイル名と行番号で構成される配列。2番目の要素以降は、インライン関数のソースコードファイル名、行番号、および関数名がリストされます。デバッグ情報が見つからなかった場合はバイナリの名前と同じ要素を持つ単一要素の配列が返され、それ以外にアドレスが無効な場合は空の配列が返されます。Array(String)。
例
内部検査関数を有効にする:
アドレスに対して関数を適用する。
スタックトレース全体に関数を適用する:
arrayJoin関数は配列を行に分割します。
addressToSymbol
ClickHouseオブジェクトファイル内のシンボルに、ClickHouseサーバープロセス内の仮想メモリアドレスを変換します。
構文
引数
address_of_binary_instruction
(UInt64) — 実行中のプロセスにおける命令のアドレス。
戻り値
例
内部検査関数を有効にする:
trace_log
システムテーブルから最初の文字列を選択する:
trace
フィールドには、サンプリング時のスタックトレースが含まれています。
単一アドレスのシンボルを取得する:
スタックトレース全体に関数を適用する:
arrayMap関数は、trace
配列の各個別の要素をaddressToSymbols
関数で処理します。この処理の結果は出力のtrace_symbols
カラムに表示されます。
demangle
addressToSymbol関数を使用して取得したシンボルを、C++関数名に変換します。
構文
引数
symbol
(String) — オブジェクトファイルからのシンボル。
戻り値
- C++関数の名前、またはシンボルが無効な場合は空文字列。String。
例
内部検査関数を有効にする:
trace_log
システムテーブルから最初の文字列を選択する:
trace
フィールドには、サンプリング時のスタックトレースが含まれています。
単一アドレスの関数名を取得する:
スタックトレース全体に関数を適用する:
arrayMap関数は、trace
配列の各個別の要素をdemangle
関数で処理します。この処理の結果は出力のtrace_functions
カラムに表示されます。
tid
現在のBlockが処理されているスレッドのIDを返します。
構文
戻り値
- 現在のスレッドID。Uint64。
例
クエリ:
結果:
logTrace
各Blockに対して、サーバーログにトレースログメッセージを出力します。
構文
引数
message
— サーバーログに出力されるメッセージ。String。
戻り値
- 常に0を返します。
例
クエリ:
結果: