QEMU -no-reboot + カーネル CLI kernel.panic=-1
qemu-system-X -no-rebootQEMU 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