Jump to contentJump to page navigation: previous page [access key p]/next page [access key n]
適用先 openSUSE Leap 15.6

8 ダイナミックデバッグ: カーネルのデバッグメッセージの調整 Edit source

概要

ダイナミックデバッグは Linux カーネル内に用意されているパワフルなデバッグ機能で、カーネルの再コンパイルやシステムの再起動を実施することなく、動的にデバッグメッセージの有効化や無効化を実施できる仕組みです。

ダイナミックデバッグは下記のような状況で使用します:

  • カーネル内部の問題の調査

  • 新しいハードウエアに対応するためのドライバ開発

  • セキュリティイベントの追跡や監査

8.1 ダイナミックデバッグの利点 Edit source

ダイナミックデバッグを使用することで、下記のような利点をもたらします:

リアルタイムなデバッグ

ダイナミックデバッグはシステムの再起動を行わずにデバッグメッセージを有効化できます。そのため、本番環境下で問題を調査する場合など、性能を損なってはならないような場合に有用です。

選択的なデバッグ

デバッグメッセージの有効化をカーネル内のパーツ単位や個別のモジュール単位で設定することができます。これにより、必要な情報のみに絞って出力することができます。

性能のチューニング

現在の解析要件に合わせてデバッグメッセージの有効/無効を切り替えることで、ダイナミックデバッグをカーネルの性能監視や最適化に使用することもできます。

8.2 ダイナミックデバッグの状態確認 Edit source

既定でダイナミックデバッグ機能の搭載されたカーネルがインストールされているはずですが、念のためダイナミックデバッグ機能が搭載されているかどうかを確認するには、下記のようなコマンドを root で実行します:

# zcat /proc/config.gz | grep CONFIG_DYNAMIC_DEBUG

ダイナミックデバッグ機能が組み込まれていれば、下記のような出力が現れるはずです:

CONFIG_DYNAMIC_DEBUG=y
CONFIG_DYNAMIC_DEBUG_CORE=y

8.3 ダイナミックデバッグの使用 Edit source

動作中のカーネルに対して、特定のデバッグメッセージやログを有効化したい場合は、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

ダイナミックデバッグに関する詳細な情報や使用例などについては、 公式文書 (英語) をお読みください。

8.4 ダイナミックデバッグメッセージの表示 Edit source

上記までの手順で有効化し、その後に出力されたデバッグメッセージを表示するには、 dmesg コマンドを使用します。なお、 grep コマンドで出力をフィルタすると、より読みやすくなります:

# dmesg | grep -i "ファイル名.c"

また、生成されたメッセージを継続的に追跡したい場合は、 tail コマンドに -f オプションを指定して実行します:

# tail -f /var/log/messages
このページを印刷