QEMU -no-reboot
+ カーネル CLI kernel.panic=-1
qemu-system-X -no-reboot
QEMU CLI オプション:ゲストが再起動しようとしたときに QEMU を終了させますkernel.panic=-1
カーネル ブート パラメーター:パニックの直後に Linux を再起動させます:https://github.com/torvalds/linux/blob/v4.17/Documentation/admin-guide/kernel-parameters.txt#L2931
0
も返します pvpanic
のように 、しかし次の利点があります:
- 何も再コンパイルする必要はありません。ブート パラメータだけです
- arm と aarch64
-M virt
で動作します x86 と同様ですが、pvpanic はarch/x86
未満であるため、x86 固有のようです。
このセットアップでテストされました。
panic
を追跡 GDB のシンボル
これを行う別の方法は、 panic
のアドレスがいつ検出されるかを検出することです。 関数に到達したら、QEMU を終了させようとします。
panic
で GDB を確実に壊すことができます https://stackoverflow.com/questions/11408041/how-to-debug-the-linux-kernel-with-gdb-and-qemu/33203642#33203642 で説明されている
しかし、TODO:QEMU をステータス 1 で終了させる方法は? monitor quit
の使用 quit
を転送する GDB 内部から GDB から QEMU モニターに接続すると、非常に近くなりますが、ステータス 0
で終了しないため、完全ではありません。 .
gem5 はデフォルトでネイティブにこの追跡を行います。これは非常に素晴らしいことです。
これは https://github.com/gem5/gem5/blob/1da285dfcc31b904afc27e440544d006aae25b38/src/arch/arm/linux/system.cc#L73 で行われます
おそらく、QEMU 開発者はこの手法からインスピレーションを得て、似たようなものを実装できるでしょう。
うまくいっているものがあります:
CONFIG_PVPANIC=y
でカーネルを構成 (およびビルド) する;これにより、コンパイル済みのpvpanic
をサポートするカーネルが生成されます。qemu-system-x86_64
を呼び出す-device pvpanic
で オプション;これにより、Qemu にカーネル パニックをキャッチ (および終了) するよう指示します。
カーネル パニックにより qemu-system-x86_64
が発生する 正常に終了します (ステータス 0
を返します) )、しかし、少なくとももうハングしていません。
正しい方向に向けてくれた @dsstorefile1 に感謝します。
参照:
- https://cateee.net/lkddb/web-lkddb/PVPANIC.html
- https://github.com/qemu/qemu/blob/master/docs/specs/pvpanic.txt