ダイナミックデバッグは Linux カーネル内に用意されているパワフルなデバッグ機能で、カーネルの再コンパイルやシステムの再起動を実施することなく、動的にデバッグメッセージの有効化や無効化を実施できる仕組みです。
ダイナミックデバッグは下記のような状況で使用します:
カーネル内部の問題の調査
新しいハードウエアに対応するためのドライバ開発
セキュリティイベントの追跡や監査
ダイナミックデバッグを使用することで、下記のような利点をもたらします:
ダイナミックデバッグはシステムの再起動を行わずにデバッグメッセージを有効化できます。そのため、本番環境下で問題を調査する場合など、性能を損なってはならないような場合に有用です。
デバッグメッセージの有効化をカーネル内のパーツ単位や個別のモジュール単位で設定することができます。これにより、必要な情報のみに絞って出力することができます。
現在の解析要件に合わせてデバッグメッセージの有効/無効を切り替えることで、ダイナミックデバッグをカーネルの性能監視や最適化に使用することもできます。
既定でダイナミックデバッグ機能の搭載されたカーネルがインストールされているはずですが、念のためダイナミックデバッグ機能が搭載されているかどうかを確認するには、下記のようなコマンドを root で実行します:
#
zcat /proc/config.gz | grep CONFIG_DYNAMIC_DEBUG
ダイナミックデバッグ機能が組み込まれていれば、下記のような出力が現れるはずです:
CONFIG_DYNAMIC_DEBUG=y CONFIG_DYNAMIC_DEBUG_CORE=y
動作中のカーネルに対して、特定のデバッグメッセージやログを有効化したい場合は、echo
コマンドで /sys/kernel/debug/dynamic_debug/control
ファイルに書き込みを行います。
ダイナミックデバッグの簡単な使用手順は、下記のようになります:
ダイナミックデバッグの機能は、カーネルのソースコード内に組み込まれた pr_debug
等の特定のデバッグマクロに依存しています。これらのマクロはカーネルの開発者に対して、コード内でのデバッグメッセージ出力に使用されています。
本章内での例は、動作中のカーネルでダイナミックデバッグが既に有効化されているはずであることから、 pr_debug
マクロが正しく動作していることを前提にしています。
たとえば特定のカーネルのソースコードファイル内にあるデバッグメッセージを有効化するには、下記のように入力して実行します:
#
echo "file ファイル名.c +p" > /sys/kernel/debug/dynamic_debug/control
特定のカーネルモジュール内にあるデバッグメッセージを有効化するには、下記のように入力して実行します:
#
echo "module モジュール名 +p" > /sys/kernel/debug/dynamic_debug/control
特定のカーネルのソースコードやカーネルモジュールに対して有効化したデバッグメッセージを無効化したい場合は、 echo
コマンドで -p
オプションを指定します。たとえば下記のようになります:
#
echo "file ファイル名.c -p" > /sys/kernel/debug/dynamic_debug/control
#
echo "module モジュール名 -p" > /sys/kernel/debug/dynamic_debug/control
ダイナミックデバッグに関する詳細な情報や使用例などについては、 公式文書 (英語) をお読みください。
上記までの手順で有効化し、その後に出力されたデバッグメッセージを表示するには、 dmesg
コマンドを使用します。なお、 grep
コマンドで出力をフィルタすると、より読みやすくなります:
#
dmesg | grep -i "ファイル名.c"
また、生成されたメッセージを継続的に追跡したい場合は、 tail
コマンドに -f
オプションを指定して実行します:
#
tail -f /var/log/messages