|
Document of c-modernization-kit (util) 1.0.0
|
OS トレース層の詳細は下位層ヘッダ (trace-etw-util.h, trace-syslog-util.h) に委ねており、利用者は意識する必要がありません。
enum trace_level で定義される共通レベルです。重大度は上から下へ低下します。
| 値 | 数値 | 意味 |
|---|---|---|
| TRACE_LV_CRITICAL | 0 | 致命的エラー |
| TRACE_LV_ERROR | 1 | エラー |
| TRACE_LV_WARNING | 2 | 警告 |
| TRACE_LV_INFO | 3 | 情報 |
| TRACE_LV_VERBOSE | 4 | 詳細 (デバッグ) |
| TRACE_LV_NONE | 5 | 出力しない |
各出力先はスレッショルドレベルを個別に設定でき、設定レベル以上の重大度のメッセージのみ出力されます。TRACE_LV_NONE を指定するとその出力先を完全に抑止します。
trace_init() 呼び出し直後の各出力先のデフォルトスレッショルドレベルは以下のとおりです。
| 出力先 | マクロ | デフォルト値 |
|---|---|---|
| OS トレース | TRACE_DEFAULT_OS_LEVEL | TRACE_LV_INFO |
| ファイル | TRACE_DEFAULT_FILE_LEVEL | TRACE_LV_ERROR |
| stderr | TRACE_DEFAULT_STDERR_LEVEL | TRACE_LV_NONE |
ファイルトレースは trace_init() 直後はパス未指定のため無効です。trace_modify_filetrc() でパスを設定して初めて有効になります。
ハンドルは stopped と started の 2 状態を持ちます。
トレースプロバイダを初期化する。
| 項目 | 説明 |
|---|---|
| 戻り値 (成功) | ハンドル (stopped 状態) |
| 戻り値 (失敗) | NULL |
| 初期識別名 | 自プロセスの実行ファイル名 (Linux: /usr/bin/myapp → "myapp"、Windows: myapp.exe → "myapp.exe")。取得失敗時は "unknown"。 |
| スレッド安全性 | スレッドセーフ。複数スレッドから並行して呼び出し可能。 |
トレースプロバイダを終了し、リソースを解放する。
| 項目 | 説明 |
|---|---|
| handle が NULL | 何もしない |
| started 状態 | 内部で自動的に停止してから解放する |
| スレッド安全性 | スレッドセーフ。進行中の trace_write 等が完了するまで待機してから解放する。 |
| 呼び出し後 | handle は無効となる |
| 項目 | trace_start | trace_stop |
|---|---|---|
| 動作 | ハンドルを started 状態へ遷移 | ハンドルを stopped 状態へ遷移 |
| 冪等性 | 既に started なら何もせず 0 を返す | 既に stopped なら何もせず 0 を返す |
| 戻り値 | 成功 0 / 失敗 -1 | 成功 0 / 失敗 -1 |
| handle が NULL | -1 を返す | -1 を返す |
| スレッド安全性 | スレッドセーフ (内部で排他制御) | スレッドセーフ (内部で排他制御) |
指定したトレースレベルでメッセージを書き込む。
| 項目 | 説明 |
|---|---|
| 戻り値 | 成功 0 / 失敗 -1 |
| 前提条件 | ハンドルが started 状態であること。stopped 状態では -1 を返す。 |
| メッセージ上限 | TRACE_MESSAGE_MAX_BYTES (1,024 バイト、null 終端含む)。超過分は UTF-8 マルチバイト境界を考慮して切り詰める。 |
| handle が NULL | 何もせず 0 を返す |
| message が NULL | 何もせず 0 を返す |
| スレッド安全性 | started 状態では複数スレッドから並行して呼び出し可能 |
printf 形式でトレースメッセージを書き込む。内部で vsnprintf を使用し、TRACE_MESSAGE_MAX_BYTES のバッファにフォーマットする。バッファを超える部分は切り詰められる。
| 項目 | 説明 |
|---|---|
| 戻り値 | 成功 0 / 失敗 -1 |
| 前提条件 | ハンドルが started 状態であること。stopped 状態では -1 を返す。 |
| handle が NULL | 何もせず 0 を返す |
| format が NULL | 何もせず 0 を返す |
| スレッド安全性 | started 状態では複数スレッドから並行して呼び出し可能 |
バイナリデータを大文字スペース区切りの HEX テキスト形式で書き込む。
| 項目 | 説明 |
|---|---|
| 戻り値 | 成功 0 / 失敗 -1 |
| message | 非 NULL の場合ラベルとして先頭に付与 ("ラベル: HH HH ...")。NULL の場合は HEX のみ。 |
| データ上限 | ラベルなしで最大 TRACE_HEX_MAX_DATA_BYTES (341) バイト。ラベル指定時はラベル長 + ": " (2 バイト) 分だけ減少。超過分は切り詰めて末尾に "..." を付与。 |
| 前提条件 | ハンドルが started 状態であること。stopped 状態では -1 を返す。 |
| data / size が NULL / 0 | 何もせず 0 を返す |
| スレッド安全性 | started 状態では複数スレッドから並行して呼び出し可能 |
出力フォーマット:
trace_hex_write と同等だが、ラベル文字列を printf 形式で指定できる。
識別名と識別番号を変更する。
| 項目 | 説明 |
|---|---|
| 戻り値 | 成功 0 / 失敗 -1 |
| 前提条件 | ハンドルが stopped 状態であること。started 状態では -1 を返す。 |
| name が NULL | trace_init() と同様に実行ファイル名を使用 |
| identifier == 0 | 識別名 = name |
| identifier > 0 | 識別名 = "<name>-<identifier>" |
| identifier < 0 | -1 を返す |
| スレッド安全性 | stopped 状態ではスレッドセーフ (内部で排他制御) |
OS トレース (syslog / ETW) のスレッショルドレベルを設定する。
| 項目 | 説明 |
|---|---|
| 戻り値 | 成功 0 / 失敗 -1 |
| デフォルト | TRACE_DEFAULT_OS_LEVEL = TRACE_LV_INFO |
| TRACE_LV_NONE | OS トレース出力を完全に抑止 |
| 前提条件 | ハンドルが stopped 状態であること。started 状態では -1 を返す。 |
| スレッド安全性 | stopped 状態ではスレッドセーフ |
ファイルトレースの出力先と設定を変更する。
| 引数 | 説明 |
|---|---|
| path | 出力ファイルパス。NULL でファイルトレースを無効化 (既存プロバイダを解放)。 |
| level | ファイルトレースのスレッショルドレベル |
| max_bytes | 1 ファイルあたりの最大バイト数。0 で既定値 (TRACE_FILE_DEFAULT_MAX_BYTES = 10 MB) を使用。 |
| generations | 保持する旧世代数。0 以下で既定値 (TRACE_FILE_DEFAULT_GENERATIONS = 5) を使用。 |
| 項目 | 説明 |
|---|---|
| 戻り値 | 成功 0 / 失敗 -1 |
| ローテーション | path → path.1 → path.2 → path.N 形式で世代管理 |
| 既存プロバイダ | 既にファイルトレースが有効な場合は既存プロバイダを解放してから新規初期化 |
| 前提条件 | ハンドルが stopped 状態であること。started 状態では -1 を返す。 |
| スレッド安全性 | stopped 状態ではスレッドセーフ |
stderr トレースのスレッショルドレベルを設定する。
| 項目 | 説明 |
|---|---|
| 戻り値 | 成功 0 / 失敗 -1 |
| デフォルト | TRACE_DEFAULT_STDERR_LEVEL = TRACE_LV_NONE (無効) |
| 出力フォーマット | YYYY-MM-DD HH:MM:SS.mmm L メッセージ (タイムスタンプは UTC、L はレベル文字 C/E/W/I/V) |
| TRACE_LV_NONE | stderr 出力を完全に抑止 |
| 前提条件 | ハンドルが stopped 状態であること。started 状態では -1 を返す。 |
| スレッド安全性 | stopped 状態ではスレッドセーフ |
stderr 出力フォーマット例:
各出力先の現在のスレッショルドレベルを取得する。
| 項目 | 説明 |
|---|---|
| 戻り値 | 現在のスレッショルドレベル |
| handle が NULL | TRACE_LV_NONE を返す |
| ロックタイムアウト | TRACE_LV_NONE を返す |
| 前提条件 | なし。started / stopped どちらの状態でも呼び出し可能。 |
| スレッド安全性 | スレッドセーフ (共有ロックで保護) |
| マクロ | 説明 |
|---|---|
| TRACE_UTIL_EXPORT | DLL エクスポート / インポートを制御する。条件に応じて以下の値を取る。 |
| TRACE_UTIL_API | 呼び出し規約を指定する。Windows では __stdcall、Linux では空。 |
TRACE_UTIL_EXPORT の展開ルール:
| 条件 | 値 |
|---|---|
| Linux (非 Windows) | (空) |
| Windows / __INTELLISENSE__ 定義時 | (空) |
| Windows / TRACE_UTIL_STATIC 定義時 (静的リンク) | (空) |
| Windows / TRACE_UTIL_EXPORTS 定義時 (DLL ビルド) | __declspec(dllexport) |
| Windows / TRACE_UTIL_EXPORTS 未定義時 (DLL 利用側) | __declspec(dllimport) |
内部状態として以下のフィールドを保持します。
| フィールド | 型 | 説明 |
|---|---|---|
| identifier | int64_t | 識別番号 |
| service_name (Windows) | char * | 識別名文字列 |
| syslog_handle (Linux) | syslog_provider_t * | syslog プロバイダハンドル |
| os_level | enum trace_level | OS トレースのスレッショルドレベル |
| file_level | enum trace_level | ファイルトレースのスレッショルドレベル |
| stderr_level | enum trace_level | stderr のスレッショルドレベル |
| running | volatile int | 実行状態フラグ (0: stopped、1: started) |
| config_rwlock | SRWLOCK (Win) / pthread_rwlock_t (Linux) | 状態保護用読み書きロック |
同一プロセス内で複数の trace_provider_t ハンドルが存在する場合、ETW プロバイダ登録 (TraceLogging) は参照カウント機構で共有されます。最後のハンドルが trace_dispose() されたときに登録が解除されます。
| ファイル | 役割 |
|---|---|
| prod/util/include/trace-util.h | 公開ヘッダー (唯一の公開インターフェース) |
| prod/util/libsrc/util/trace-provider.c | コア実装 (状態管理・ロック・出力振り分け) |
| prod/util/include/trace-file-util.h | ファイル出力プロバイダ (ローテーション機能付き) |
| prod/util/include/trace-etw-util.h | Windows ETW 下位層ヘッダー (詳細は同ヘッダ参照) |
| prod/util/include/trace-syslog-util.h | Linux syslog 下位層ヘッダー (詳細は同ヘッダ参照) |
| prod/util/docs/trace-util.md | このファイル |