トップ «前の日記(2003年03月05日) 最新 次の日記(2003年03月07日)» 編集
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|10|12|
2009|02|03|06|07|10|11|12|
2010|01|02|03|04|07|09|10|11|12|
2011|01|03|04|05|06|07|08|10|
2012|01|06|08|09|10|12|
2013|01|02|03|04|07|09|11|12|
2014|01|03|04|05|06|09|
2015|04|
2016|01|08|
ここは旧えびめもです。えびめも2に移行します(2016/12/1)

2003年03月06日

カーネル空間コードのデバック自分用メモ

メジャーなツールとして以下の2種類がある

kdb(カーネルデバッカ)
カーネルに組み込んで使う
1台のPCで利用できる。キーボードのPauseキーを押したらいつでもデバック画面に入れる。シンプルでお手軽だ。
http://oss.sgi.com/projects/kdb/

kgdb(カーネルgdb)
カーネルに組み込んで使う
必ず2台のPCが必要
ターゲット機ではカーネルにgdbサーバを組み込んで動かし、シリアルケーブルで接続したもう1台のPCでユーザーインターフェース用のgdbを動かして操作する。gdbのフル機能が使える(らしい)
http://kgdb.sourceforge.net/
http://sourceforge.net/projects/kgdb/

kdb

kernel-2.4.20でkdbを使ってみた。 ftp://oss.sgi.com/projects/kdb/download/v3.0/から
kdb-v3.0-2.4.20-common-1.bz2
kdb-v3.0-2.4.20-i386-1.bz2
をダウンロード
$ bzip2 -d kdb-v3.0-2.4.20-common-1.bz2
$ bzip2 -d kdb-v3.0-2.4.20-i386-1.bz2
# cd /usr/src/linux
# patch -p1 < kdb-v3.0-2.4.20-common-1
# patch -p1 < kdb-v3.0-2.4.20-i386-1
# make menuconfig
Kernel hacking  --->
  [*]   Compile the kernel with frame pointers
  [*]   Built-in Kernel Debugger support (NEW)
# make dep bzImage
# cp arch/i386/boot/bzImage /boot
# vi lilo.conf
append="kdb=on"
# lilo
# reboot

再起動してきたらキーボードの Pauseキーを押すといつでもシステムが停止してデバッカに入れる。Pauseキーを押してデバック画面に入るとキーボードのLEDが点滅する。たまにキー入力が効かないことがあるかリターンキーを数回押すと直る。hでヘルプ、gで再開、btでバックトレース、ssでシングルステップ実行。bpで怪しそうな箇所にブレイクポイントを張って(ラベルは使えるので関数名でOK)gで再開させ、ブレイクが来たらssでシングルステップ実行させてバグを追うといった使い方をする。ただしC言語ソースレベルでバックはできないのでi386のアセンブラの知識が必要だしローカル変数もスタックフレームから追わなければならないのでかなり上級者向けだ。

それでもkdbを入れておけば、例えばドライバのバグでハングアップ(無限ループ)に入ってしまったときにあわてずPauseキーを押してデバック画面に入ればとりあえずPC値がわかるので(関数名+オフセット番地)どこで無限ループしているかは把握できる。

使ってみた感触としてはkdbパッチを当てておけば万が一の時に役に立つと思うし普段は意識しないので当てておいて損は無いと思う。