GNU/Linux >> Linux の 問題 >  >> Linux

Qemu をカーネル パニック時にエラーで終了させることはできますか?

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

Linux
  1. Lsでアンカー^$を使用できますか?

  2. 部分的なパスワードでログインできるのはなぜですか?

  3. Linux で Xcode を実行できますか?

  1. GDB と QEMU を使用して Linux カーネルをデバッグするには?

  2. menuconfig を作成できません

  3. Linux カーネルはどうしてこんなに小さいのでしょうか?

  1. 「カーネルパニック」?

  2. 壊れたパイプでTail-fを終了しますか?

  3. Dpkgでカーネルアップデートをブロックしますか?