kernel debug tips ― 2006年07月24日 13時45分57秒
まずは ddb を使ってみようと思いカーネルを作り直したが、なぜか ddb に落とすと、キーボードの入力を受け付けなくなってしまった。進むことも戻ることもできなかった。こちらは後でまた必要になったら見ることにする。
カーネルの構築の仕方は、
$ /usr/src
$ make buildkernel installkernel
の新しい流儀と
$ cd /usr/src/sys/i386/config
$ config GENERIC
$ cd ../compile/GENERIC
$ make depend
$ make
$ make install
の古い流儀がある。カーネルのデバッグのする時は、古い流儀の方が使いやすかった。
カーネルのインストールには KODIR という変数が使われる。何も設定していなかった時の値は /boot/kernel だ。つまり、何も設定しなかった時の既存値である。まず、カーネルのデバッグを開始する前に GENERIC を作り直す。既に独自の config を使っていてコンパイルした物が残っていれば、それでもよい。
第一の tip として、make install KODIR=/boot/generic として、インストールする。カーネルが /boot/generic に入れられる。起動不可能なカーネルが出来てしまった時の保険である。第二ローダの時に、プロンプトに移りブート出来るようにする。kernel.old では make install 時に消されてしまうので、手違いで二回続けて起動できないカーネルを作ってしまったら、もう後が無い。
/usr/src で make installkernel KODIR=/boot/generic を一度試したが、動作しなかったと記憶している。
第二の tip としては、printf であろう。カーネルやカーネルモジュール内で printf をすると、コンソールと syslog に printf の内容が出力される。tail -f /var/log/messages とやると、適時新しいものが見られるわけだ。ddb 等を使う前に軽く、動作の流れを把握するのに役に立つ。
第三の tip は grep DEBUG *.h をすることである。結構、SMBVDEBUG などと DEBUG 用の出力は残っている。最初にやることとしては、有効な手段である。この様なデバッグ文を有効にすると、何が起きているのか掴み易くなる。また、関数名などを埋め込むようなマクロなので、自分で使っても関数名を自動的に出力するのがよい。
第四の tip はなるべくカーネルモジュールでデバッグすることである。カーネルに組み込まない方がいい。カーネルモジュールであると、kldunload を使ってカーネルから外すことが出来る。ここで、make && make install をした後、また kldload で読み込むと変更後のものが読み込まれる。つまり、カーネルのデバッグをするのに再起動する必要がないのだ。これは、まず再起動を待つ必要がない事を意味する。いくら早いとはいえ、何回も再起動すると最終的にはかなりの時間を費やす。それよりも便利なのは、環境を壊す事が無いことだ。エディタや作業用のウィンドウを毎回準備するのは骨が折れる。
例えば、mount_smbfs をすると、自動的に smbfs.ko が読み込まれる。何らかのテストをし、ソースに変更を入れ make && make install をする。この後、kldunload smbfs とやった後に、mount_smbfs をやると新しい変更された smbfs.ko が読まれるのだ。
smbfs の utf-8 はまだまだ時間が掛かりそうだ。
最近のコメント