kernel debug tips2006年07月24日 13時45分57秒

smbfs の為にカーネルをデバッグしている。FreeBSD のカーネルのデバッグのやり方についての知識集などを探したが、これといってめぼしいものはなかった。そこで今回見つけたこまごまとしたものを並べてみようと思う。

まずは 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 はまだまだ時間が掛かりそうだ。

前回次回

コメント

_ yamane ― 2006年07月24日 20時03分19秒

ddbが利用できないのは6.1Rから入ったkbdmuxのせいです。/boot/loader.confでhint.kbdmux.0.disabled="1"を設定するか、kernelのコンフィグレーションファイルで無効にしてみてください。また、新しい流儀でもKODIR変数は利用可能です(sys/conf/kern.pre.mkで定義されています)。流儀がかわったといっても、より簡単かつ安全にできるようにしただけで、基本的な処理方法は以前と同じです。

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2006/07/24/459321/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。