条件付きコンパイルによってドライバ内にデバッグ用のコードを挿入するには、DEBUG などのプリプロセッサシンボル、またはグローバル変数を使用します。条件付きコンパイルを使用すると、本番ドライバ内で不要なコードを削除できます。実行時のデバッグの出力量を設定するには変数を使用します。出力は、ioctl またはデバッガを使用して実行時のデバッグレベルを設定することで指定できます。通常は、これらの 2 つの方法が組み合わせられます。
次の例はコンパイラを使って到達不能コード (この場合は常に偽となるゼロのテストに続くコード) を削除しています。この例では、/etc/system で設定したり、デバッガによってパッチを適用したりできるローカル変数も提供しています。
#ifdef DEBUG /* comments on values of xxdebug and what they do */ static int xxdebug; #define dcmn_err if (xxdebug) cmn_err #else #define dcmn_err if (0) cmn_err #endif /* ... */ dcmn_err(CE_NOTE, "Error!\n");
この方法は、cmn_err (9F) が可変数の引数を持つ状況を処理します。もう 1 つの方法は、マクロには引数が 1 つ (cmn_err (9F) 用の括弧付きの引数リスト) あることを利用します。マクロはこの引数を削除します。このマクロは、DEBUG が定義されていない場合はマクロをゼロに展開することによって、オプティマイザへの依存も削除します。
#ifdef DEBUG /* comments on values of xxdebug and what they do */ static int xxdebug; #define dcmn_err(X) if (xxdebug) cmn_err X #else #define dcmn_err(X) /* nothing */ #endif /* ... */ /* Note:double parentheses are required when using dcmn_err. */ dcmn_err((CE_NOTE, "Error!"));
この手法は多くの方法で拡張できます。1 つの方法として、xxdebug の値に応じて、cmn_err(9F) からのさまざまなメッセージを指定します。ただし、そのような場合は、デバッグ情報が多すぎてコードが複雑でわかりにくくならないように気を付ける必要があります。
もう 1 つ一般的なのは、xxlog() 関数を記述する方法です。この関数は vsprintf(9F) または vcmn_err(9F) を使用して可変引数リストを処理します。