39

カーネル開発は初めてで、QEMU と gdb を使用して Linux カーネルを実行/デバッグする方法を知りたいです。私は実際にRobert Loveの本を読んでいますが、残念ながら、カーネルを実行またはデバッグするための適切なツールをインストールする方法について読者の助けにはなりません. /2011/02/kernel-development-debugging-using-eclipse/ . カーネル上で開発するための IDE として Eclipse を使用していますが、最初に QEMU/gdb で動作するようにしたいと考えていました。だから私がこれまでにしたことは次のとおりです。

1) カーネルをコンパイルするには:

make defconfig (then setting the CONFIG_DEBUG_INFO=y in the .config)
make -j4

2) コンパイルが終了したら、次を使用して Qemu を実行します。

qemu-system-x86_64 -s -S /dev/zero -kernel /arch/x86/boot/bzImage

「停止」状態でカーネルを起動する

3) したがって、gdb を使用する必要があるため、次のコマンドを試します。

gdb ./vmlinux

これは正しく実行されますが...どうしたらよいかわかりません...ポート1234(Qemuが使用するデフォルトポート)でリモートデバッグを使用する必要があることはわかっています.vmlinuxをシンボルテーブルファイルとして使用しますデバッグ。

私の質問は次のとおりです。Qemu でカーネルを実行し、デバッガーをそれに接続して、それらを連携させて、カーネル開発で私の人生を楽にするためにはどうすればよいでしょうか。

4

6 に答える 6

33

私は試してみたい:

(gdb) target remote localhost:1234
(gdb) continue

「-s」オプションを使用すると、qemu はポート tcp::1234 でリッスンします。同じマシンにいる場合は、このポートに localhost:1234 として接続できます。Qemu の '-S' オプションは、continue コマンドを実行するまで Qemu の実行を停止します。

最善の方法は、適切な GDB チュートリアルを見て、あなたがやっていることを理解することでしょう。これはかなりいいですね。

于 2012-07-10T09:02:57.047 に答える
29

Ubuntu 16.10 ホストでテストされた段階的な手順

ゼロからすばやく始めるために、完全に自動化された最小限の QEMU + Buildroot の例を作成しました: https://github.com/cirosantilli/linux-kernel-module-cheat/blob/c7bbc6029af7f4fab0a23a380d1607df0b2a3701/gdb-step-debugging.md手順については以下で説明します。

最初にルート ファイルシステムを取得しますrootfs.cpio.gz。必要な場合は、次のことを検討してください。

次に、Linux カーネルで次のようにします。

git checkout v4.15
make mrproper
make x86_64_defconfig
cat <<EOF >.config-fragment
CONFIG_DEBUG_INFO=y
CONFIG_DEBUG_KERNEL=y
CONFIG_GDB_SCRIPTS=y
EOF
./scripts/kconfig/merge_config.sh .config .config-fragment
make -j"$(nproc)"
qemu-system-x86_64 -kernel arch/x86/boot/bzImage \
                   -initrd rootfs.cpio.gz -S -s \
                   -append nokaslr

別のターミナルで、Linux カーネル ツリー内から、次の場所からデバッグを開始するとしますstart_kernel

gdb \
    -ex "add-auto-load-safe-path $(pwd)" \
    -ex "file vmlinux" \
    -ex 'set arch i386:x86-64:intel' \
    -ex 'target remote localhost:1234' \
    -ex 'break start_kernel' \
    -ex 'continue' \
    -ex 'disconnect' \
    -ex 'set arch i386:x86-64' \
    -ex 'target remote localhost:1234'

そして完成です!!

カーネル モジュールについては、QEMU を使用して Linux カーネル モジュールをデバッグする方法を参照してください。

Ubuntu 14.04 の場合、GDB 7.7.1hbreakが必要で、breakソフトウェア ブレークポイントは無視されました。16.10 ではもうそうではありません。参照: https://bugs.launchpad.net/ubuntu/+source/qemu-kvm/+bug/901944

厄介disconnectで、その後に続くのは、エラーを回避することです。

Remote 'g' packet reply is too long: 000000000000000017d11000008ef4810120008000000000fdfb8b07000000000d352828000000004040010000000000903fe081ffffffff883fe081ffffffff00000000000e0000ffffffffffe0ffffffffffff07ffffffffffffffff9fffff17d11000008ef4810000000000800000fffffffff8ffffffffff0000ffffffff2ddbf481ffffffff4600000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007f0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000801f0000

関連スレッド:

既知の制限:

以下も参照してください。

于 2015-10-18T21:46:45.557 に答える
2

gdb を使用して vmlinux exe を起動しようとする場合、gdb で最初に行うことは、cmds を発行することです。

(gdb) ターゲット リモート localhost:1234

(gdb) start_kernel を壊す

(継続する)

これにより、start_kernel でカーネルが壊れます。

于 2013-08-19T03:27:09.307 に答える