BSD/OSのカーネルのデバッグ方法

ここでは、BSD/OSのカーネルをシリアル経由でdebugする方法を説明します。 私と河野先生以外やる人がいるかどうか分かりませんんが…。

1、準備

まず、serial portを持っているマシンを2台と232Cケーブルを用意します。 ここでは、debugする方のマシンをA、モニタするマシンをBと呼びます。

2、カーネルのコンパイル

カーネルのコンパイルはBで行う必要があります。まずカーネルのソースをBに 持って来ます。
次に、カーネルのconfiguration file(GENERICなら、/src/sys/i386/conf/GENERIC) の以下の行のコメントを外します。

makeoptions DEBUG="-g"
options DEBUG
options KGDB
options "KGDBRATE=38400"# remote debugging baud rate options "KGDBDEV=0x800001"

bootを途中で止めたい時は、

options "KGDBINIT=1"

もコメントアウトしましょう。debugからアクセスされるまで、serialを認識したと ころでbootがとまります。device driverを認識させる時は必須でしょう。

あとはふつうにカーネルをコンパイルします。 config , make depend, makeですね。 コンパイルが完了すると、bsdとbsd.gdbというファイルができます。 bsdをAのルート / にコピーして下さい。

3、デバッカの起動

カーネルのコピーが終わったらAを再起動します。 config fileで "KGDBINIT=1" をコメントアウトしていると、bootが途中で止まってgdbから アクセスがくるまでまちます。
ここで、Bのbsd.gdbがある場所で、

% gdb -k bsd.gdb

としてgdbを上げます。emacs上で上げてももちろんOK。

AとBがシリアルでつながってることを確認して、gdbのプロンプト上で、

(gdb) set sl-baudrate 38400

(gdb) target remote /dev/tty00

とすれば、kernelのdebugの始まりです。 あとは普通のgdbと同様にして使えます。breakしてprintしてcontinueして…。
がんばって虫をとろう。


神里 健司 Takeshi KAMIZATO, Specialty of Information Engineering, Univ of the Ryukyus