SBCでLinuxのカーネルドライバの挙動を調べる必要に迫られ、debugfsを使ってカーネルの内部関数やモジュール単位でカーネルのデバッグメッセージを有効化する事を試したので、その方法をメモしておく。
カーネルのビルドオプションを変更
以下のカーネルオプションを有効化する。
- CONFIG_DYNAMIC_DEBUG: dynamic_debug機能を有効にする
- CONFIG_DEBUG_FS: debugfsファイルシステムを有効にする
カーネルオプション有効化は、以下のような手順を踏めばOK。
- “make linux-menuconfig”を実行
- メニュー画面で”/”キーを押して検索ダイアログを出す
- 有効化したいオプション名の文字列を入力(部分文字列でOK)
- 検索結果の中から有効化したいオプションを探し、該当オプションの数字を入力
- 該当オプションのメニューが表示されるので有効化する
カーネルメッセージの有効化
オプションを有効化したカーネルをビルドし、起動した後の手順。
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カーネルの挙動を調べたい時などに便利。ただデバッグメッセージの出力コードがそもそも記述されている必要があり、場合によってはカーネルのソースコードに自分で手を入れてメッセージ出力コードを追加する必要があるかもしれない。
コメント