Debugging Kernel Problems

BSDCan 2006でのGreg Lemis氏の資料。
Lemis氏は「The Complete FreeBSD」の著者でもある。
http://wwww.lemis.com/grog/Papers/Debug-tutorial/tutorial.pdf
http://www.feyrer.de/NetBSD/bx/blosxom.cgi/nb_20060511_1032.html

読んだメモ

・dmesg で表示されるログ
(gdb) printf "%s", (char*)msgbufp->msg_ptr
で表示できる。
/usr/src/sys/sys/cons.h

・全てのunixで通用するmainの正式なプロトタイプは
int main(int argc, char* argv, char* env)

・関数を呼び出すときに積むフレームポインタは必ず必要なものではない

・Elfでシステムコールを呼び出すときに使うアセンブラ命令は int
a.out では lcall だった。

カーネルをシンボルつきでビルドするには
/usr/src/sys/i386/conf/GENERIC

#makeoptions DEBUG=-g #Build kernel with gdb(1) debug symbols
を追加。
これをつけてもカーネルのコードはほとんど変わらない。

カーネルコンフィグファイルについての詳細は
/usr/src/sys/conf/NOTESを参照。

gdb用のgdbinitが用意されている。
/usr/src/tools/debugscripts/README

・現在動いているカーネルデバッグすることもできる。
gdb -k /usr/src/sys/i386/MONORCHID/kernel.debug /dev/mem
(coreの変わりに /dev/mem を指定している)