Overview
カーネルのソースコードを書き換える場合においても,やはり修正ミスが生じます. しかし,カーネルの修正の場合,ミス=カーネルパニックとなり即座にリブートが 発生するケースも多々あります.この場合,なかなかデバッグ作業がうまくいきません. そんな時に利用するのが,gdbによるカーネルデバッグ.
Kernel debug利用方法
クラッシュダンプを吐くデバイスの設定
/etc/rc.confにdumpdev="/dev/<device>"の記述を追加します. <device>には,/etc/fstabに記述されているスワップデバイスを指定します. また,あらかじめ/var/crashディレクトリを作成しておきます.尚,スワップデバイスには, 搭載されている物理メモリ以上の容量が確保されている必要があります.確保されていない場合には, カーネルコンフィグファイル (通常は,/usr/src/sys/i386/conf/GENERIC)に,MAXMEM=(X*1024) というoptionsを追加します(メモリの最大容量をX MByteに制限).
カーネルの再構築
デバッグオプション (-g)を付加して,カーネルを再構築します.尚,(少なくともFreeBSD 4.10では) make install時にobjcopyによってデバッグ情報の無いカーネルが自動的にインストールされるので, デバッグオプションを用いたことにより,パフォーマンスが著しく低下したなどの問題は発生しないと 思います.
# cd /usr/src/sys/i386/conf # config -g GENERIC # cd ../../compile/GENERIC # make depend # make # make install # reboot
デバッグ操作
以上の設定により,カーネルパニックが発生した時に物理メモリのdumpが/var/crach に保存されるようになります.デバッグを行うには,リブート後に以下のコマンドにより カーネルデバッガを起動させます(Xは,0以上の整数値).
gdb -k /usr/src/sys/compile/GENERIC/kernel.debug /var/crash/vmcore.X