この機能は FreeBSD 2.2 からサポートされました. これは本当にすばらし い機能です.
GDB はすでにかなり以前より リモートデバッグ をサポートしてい ます. これはシリアル回線を使い非常に単純なプロトコルで行ないます. もちろん, この方法では今までに示した方法とは違い, 2台のマシンが必 要になります. 1台はデバッグ環境のためのホストで, すべてのソースとす べてのシンボルを含んだバイナリのコピーを持っています. もう 1台は ターゲットマシンで, 同一のカーネルのコピー (ただしデバッグ情報は 取り除いてあるもの) を単に実行するためのものです.
この場合, カーネルのコンフィグレーションは config -g
で行な
い, DDB を含めなくてはなりません. そうして通常通りコンパイルし
ます. こうして作ったバイナリファイルはデバッグ情報のために非常に大き
くなります. このカーネルをターゲットマシンにコピーして
strip -x
でデバッグシンボルを取り除きます. そして -d
ブートオプションを使いブートします. ターゲットマシンの 1番目の
シリアル回線をデバッグホストのいずれかのシリアル回線につないでおきま
しょう. それからデバッグ(訳注:ホスト)マシン上で, ターゲットとなって
いるカーネルのコンパイルディレクトリで gdb を起動します:
% gdb -k kernel
GDB is free software and you are welcome to distribute copies of it
under certain conditions; type "show copying" to see the conditions.
There is absolutely no warranty for GDB; type "show warranty" for details.
GDB 4.16 (i386-unknown-freebsd),
Copyright 1996 Free Software Foundation, Inc...
(kgdb)
リモートデバッグセッションの初期化 (1番目のシリアルポートを使用する ことの設定) を以下のように行ないます.
(kgdb) target remote /dev/cuaa0
次にターゲットマシン (デバイスのプローブ直前で DDB に入っています) で次のように入力します:
Debugger("Boot flags requested debugger")
Stopped at Debugger+0x35: movb $0, edata+0x51bc
db> gdb
DDB は次のような出力を返すでしょう.
Next trap will enter GDB remote protocol mode
``gdb''と入力するたびに リモート GDB とローカル DDB が交互に切り替わ ります. トラップをすぐに起こすために単に ``s'' (step) と入力して下 さい. そうするとホストの GDB はターゲットのカーネルの制御を行なうよ うになります.
Remote debugging using /dev/cuaa0
Debugger (msg=0xf01b0383 "Boot flags requested debugger")
at ../../i386/i386/db_interface.c:257
(kgdb)
このセッションではソースコードへのフルアクセスや Emacs の window 上 の gud-mode (これは別の Emacs window に自動的にソースコードを表示し ます) で動かすなど, 通常の GDB セッションでできることのほとんどのこ とができます.
リモート GDB は LKM のデバッグも行なうことができます. 最初に LKM を デバッグシンボルを含めた形で作ります.
# cd /usr/src/lkm/linux
# make clean; make COPTS=-g
そしてターゲットマシン上でモジュールのこのバージョンをインストールし
ます. これをロードしてから, modstat
を使ってロードされている
ことを確認してください:
# linux
# modstat
Type Id Off Loadaddr Size Info Rev Module Name
EXEC 0 4 f5109000 001c f510f010 1 linux_mod
示されたロードアドレスに 0x20 (a.outのヘッダはおそらくこの大きさでしょ
う) を加えます. それがモジュールコードの再配置されるアドレスです.
GDB の add-symbol-file
コマンドを使ってデバッガにモジュールの
情報をつたえます.
(kgdb) add-symbol-file /usr/src/lkm/linux/linux_mod.o 0xf5109020
add symbol table from file "/usr/src/lkm/linux/linux_mod.o" at
text_addr = 0xf5109020?
(y or n) y
(kgdb)
これで LKM のすべてのシンボルにアクセスできるようになります.