GDB + QEMUのハードウェアブレークポイントがstart_kernelを欠落しています。

GDB + QEMUのハードウェアブレークポイントがstart_kernelを欠落しています。

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のバグもあります。バグ修正バージョンがあることを確認してください。

以下で私が提出したパッチを確認してください。

  1. シングルステップエラー:https://patchwork.kernel.org/project/qemu-devel/patch/[Eメール保護]/
  2. ブレークポイントエラー:https://patchwork.kernel.org/project/qemu-devel/patch/[Eメール保護]/

関連情報