kgdb+Insight

kgdbとか使おうとしたら、この辺のフロントエンドは使えない予感!

初心者のためのgdbフロントエンド

kgdbwaitで開始→Insightでブレークを張る→走らせる→ブレークで止まってステップ実行
であれば可能のはず、と思って試してみた。

デバッギ側のカーネルの準備

以下Debian Lennyの場合。
標準システムでインストールし、rootでログインする。

# export LANG=C
# aptitude install linux-source-2.6.26 linux-kbuild-2.6.26 kernel-package libncurses5-dev zlib1g-dev
# cd /usr/src
# tar jxf linux-source-2.6.26.tar.bz2
# cd linux-source-2.6.26
# cp /boot/config-2.6.26-2-686 .config
# make menuconfig

「Kernel hacking」の項目を選択し、「KGDB: kernel debugging with remote gdb」と「Compile the kernel with debug info」をチェックする。
設定を保存して終了し、この設定でカーネルパッケージを作成する。Debianの場合主要ドライバがモジュールになっているためinitrdが必要。そのためmake-kpkgを使用してビルドする。

# cd /usr/src/linux-source-2.6.26
# make-kpkg --initrd kernel_image
# cd /usr/src
# dpkg -i linux-image-*

dpkgでインストール後には、/boot/grub/menu.lstに新しいエントリが追加されているはず。以下のようなkgdbを有効化したエントリを追加する。

title		Debian GNU/Linux, kernel 2.6.26 (kgdb enabled)
root		(hd0,0)
kernel		/boot/vmlinuz-2.6.26 root=/dev/hda1 ro kgdboc=ttyS0,115200 kgdbwait
initrd		/boot/initrd.img-2.6.26

デバッグ側に/usr/src/linux-source-2.6.26/vmlinuxをコピーしておく。また、linux-source-2.6.26.tar.bz2をデバッグ側の/usr/src/に展開しておく。

デバッグ側がLinuxの場合

VMware上に2つLinuxをインストールし、片方でkgdb(デバッギ)、もう片方でInsight(デバッガ)を動かしてみた。デバッギのシリアルポートをサーバ側にして、デバッガ側のシリアルポートをそれにつなぎ、シリアル接続(InsightのTargetメニューからRemote/Serial)でデバッグ可能。
公式サイトの最新版(insight-weekly-6.8.50-20090427)はエディットボックスに文字が入力できないという状態で正常動作せず。6.7.1や6.8であれば起動できた。
しかしRunメニューにConnect to targetが出てこないという問題が。(このメニューが出てこない状態でRunすると、接続して即Continueしてしまうためブレークが張れない)
リモート接続のメニューを出すかどうかをネイティブ(非クロス環境)かどうかで判断しているため、ネイティブだけどリモートというパターンに対応できていない。とりあえずsrcbar.itclを書き換えて対処。
insight vmlinux または gdb -w vmlinux で起動。

アタッチできた場合、kgdb.c内で停止しているので、止めたい場所にブレークを張ってcontinueすればよい。
ブレーク信号で止められるのかどうかは不明。

デバッグ側がCygwinの場合

VMware上のLinuxCygwinからデバッグしてみた。
準備としては、ゲストOS(Linux)にnamed pipeとしてシリアルポートを追加し、ホストOSにNamed pipe TCP Proxyをインストールしておく。
Cygwinの最新版(gdb-6.8-2)や公式の最新版(insight-weekly-6.8.50-20090427)は正常動作させられず。公式の6.7.1や6.8はビルドできた。
クロス環境なので以下のようにビルド。
※ GCC4系だと少し修正が必要

# ./configure --host=i686-pc-cygwin --target=i686-pc-linux-gnu
# make install

i686-pc-linux-gnu-insight vmlinux で起動。TargetメニューでRemote/TCPにして接続。

GUIでウォッチできる。便利。
注意点としては、CygwinWindowsなので大文字小文字のみが異なるファイルは上書きされてしまう。そのため正常に追えないケースがある。また、Stopボタンをクリックしても止めることはできない。必要ならSysreqなどで停止できるようにしておく。


Insightはなぜかよく固まるけどあまり気にしないほうが良い。デバッガをデバッグしはじめたりすると何をやっているのかわからなくなるのでお勧めしない。