QEMUで実行されているカーネルをデバッグするためにGDBを使用しようとしています。
カーネルは次のオプションでコンパイルされました。
CONFIG_DEBUG_INFO=y
CONFIG_GDB_SCRIPTS=y
次のコマンドを使用して、qemuでカーネルを起動します。
qemu-system-x86_64 -s -S -kernel arch/x86_64/boot/bzImage
別の端末で同じパスでGDBを起動し、次のコマンドを順番に実行しました。
gdb ./vmlinux
(gdb) target remote localhost:1234
(gdb) hbreak start_kernel
(gdb) c
私は今、完全な動作システムではなくカーネルだけに興味があるので、rootfsを提供しません。私もhbreak/breakの組み合わせを試しました。
カーネルが起動されたばかりで、rootfsが見つからなかったため、カーネルパニックが発生しました...これは期待されていました。 start_kernelで停止し、コードを段階的に実行したいと思います。
観察:すぐにブレークポイントを設定すると機能し停止しますが、start_kernel /startup_64/mainでは機能しません。
qemuがこれらすべての機能を呼び出さないか、どのような方法でブロックされる可能性はありますか?
Kernel: 4.13.4
GDB: GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.3) 7.7.1
GCC: gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
system: ubuntu 14.04 LTS
注:これと同じプロセスはカーネル3.2.93では機能しますが、4.13.4では機能しないため、より多くの構成が必要になるようです。カーネル4.0以降では、このデバッグプロセスを有効にするリソースがオンラインで見つからないので、今は3.2を使用します。これに関するすべてのコメントは歓迎されています。
答え1
私も同じ問題がありましたが、解決策を見つけました。Linuxカーネル初心者メーリングリスト。
無効にする必要がありますカスラウ語カーネルコマンドラインでオプションを使用するか、nokaslr
カーネルオプションを無効にします。「カーネルメモリ部分をランダムに指定」~へ「プロセッサの種類と機能」カーネルイメージをビルドするとき。
答え2
tcgアクセラレータを使用している場合は、「nokaslr」に加えて、qemuにgdbstubのバグもあります。バグ修正バージョンがあることを確認してください。
以下で私が提出したパッチを確認してください。