gdb で qemu なソレに

参考にしたのは以下なエントリ。

qemu には

  • -s オプションで 1234 ポートで gdb の接続を待つ
  • -S オプションでスタートアップ時に CPU をスタートしない (モニターで 'c' を入力する必要あり)

という必殺気味なオプションがあるようです。
ただ、上記エントリによるとデバッグ情報が出力されたカーネルを作らなければならない、との事。とりあえずカーネルを make してリモートデバッグとの事なんですが以下との事。

# cd linux-0.0-rm-3.5
# qemu -m 8 -hdb hd_oldlinux.img -fda Image -boot a -s -S&
# gdb Image
(gdb) target remote localhost:1234
(gdb) symbol-file tools/system
(gdb) break main
(gdb) c

かなぁ。で、ヤッてみたんですが失敗。qemuctl だったorz

再起動ちう。attack できるかどうか。今日ぶっちゃけへろへろなんだよねぇ。

でけた

投入したコマンドは以下かな。諸事情にて微妙な箇所にカーネルがありますが大丈夫かな。

$ qemuctl -m 8 -hdb hd_oldlinux.img -fda Image -boot a -s -S&
$ gdb Image
(gdb) target remote localhost:1234
Remote debugging using localhost:1234
0x0000ff0 in ?? ()
(gdb) symbol-file tools/system
Reading symbols from /home/rms/vmware/root/linux-0.01-rm-3.5/tools/system...done.
(gdb) break main
Breakpoint 1 at 0x522f: file init/main.c, line 80.
(gdb) c
Continuing.

Breakpoint 1, main() at init/main.c:80
80      {                      /* The startup routine assumes (well, ...) this */
(gdb)

いやはやこれはこれは。とは言え今日はこれで寝ます。体調崩し気味。

ワラタ

上記の状態から continue したら kernel panic した。よく見たら -hdb ってしてるし。以下が正しいですね。

# qemuctl -m 8 -hda hd_oldlinux.img -fda Image -boot a -s -S&

あと、特に su - とかしてなくても大丈夫です。もう一つ、カレントディレクトリはカーネルソースのディレクトリに居る必要があるようですね。