debugfsを利用したLinuxカーネルメッセージの有効化

SBCでLinuxのカーネルドライバの挙動を調べる必要に迫られ、debugfsを使ってカーネルの内部関数やモジュール単位でカーネルのデバッグメッセージを有効化する事を試したので、その方法をメモしておく。

スポンサーリンク

カーネルのビルドオプションを変更

以下のカーネルオプションを有効化する。

  • CONFIG_DYNAMIC_DEBUG: dynamic_debug機能を有効にする
  • CONFIG_DEBUG_FS: debugfsファイルシステムを有効にする

カーネルオプション有効化は、以下のような手順を踏めばOK。

  1. “make linux-menuconfig”を実行
  2. メニュー画面で”/”キーを押して検索ダイアログを出す
  3. 有効化したいオプション名の文字列を入力(部分文字列でOK)
  4. 検索結果の中から有効化したいオプションを探し、該当オプションの数字を入力
  5. 該当オプションのメニューが表示されるので有効化する

カーネルメッセージの有効化

オプションを有効化したカーネルをビルドし、起動した後の手順。

debugfsのマウント

手動でマウント。

sudo mount -t debugfs none /sys/kernel/debug

マウントを自動化したい場合は、fstabに以下を追加しておく。

debugfs  /sys/kernel/debug  debugfs  defaults  0  0

いちいちsudo付けるのが面倒なので、パーミッションを開けてしまう。

sudo chmod a+rwx /sys/kernel/debug
sudo chmod a+w -R /sys/kernel/debug

/sys/kernel/debug/dynamic_debugに対してコマンドを投げるので、存在を確認しておく。

$ ls -l /sys/kernel/debug/dynamic_debug
total 0
-rw-rw-rw-    1 root     root             0 Jan  1  1970 control

特定の関数のデバッグメッセージを有効化/無効化

serial8250_interruptという関数のデバッグメッセージを有効化したい場合は以下を実行。

echo 'func serial8250_interrupt +p' > /sys/kernel/debug/dynamic_debug/control

無効化したい時は、+pを-pに変える。

echo 'func serial8250_interrupt -p' > /sys/kernel/debug/dynamic_debug/control

ターゲットとなるドライバのソースファイルパスを指定して有効化

カーネルのソースツリーの相対パスを指定すると、特定のソースファイルに対してデバッグメッセージを有効化出来る。上と同様、+pを-pに変えて実行すると無効化出来る。

echo 'file drivers/tty/serial/8250/8250.c +p'  > /sys/kernel/debug/dynamic_debug/control

以下で全てを有効化出来る(大量のメッセージが表示されるので注意)

echo 'file * +p'  > /sys/kernel/debug/dynamic_debug/control

まとめ

今回の方法は、Linuxカーネルの挙動を調べたい時などに便利。ただデバッグメッセージの出力コードがそもそも記述されている必要があり、場合によってはカーネルのソースコードに自分で手を入れてメッセージ出力コードを追加する必要があるかもしれない。

コメント