内部調査関数
この章で説明する関数を使用して、クエリプロファイリングのために 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) — 実行中のプロセス内の命令のアドレス。
返される値
- 最初の要素がファイル名と行番号でコロンで区切られた配列。その後、インライン関数のソースコードファイル名、行番号、および関数名がリストされます。デバッグ情報が見つからなかった場合は、単一要素の配列がバイナリ名で返され、無効なアドレスの場合は空の配列が返されます。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 を返します。
例
クエリ:
結果: