QEMU -no-reboot + CLI del núcleo kernel.panic=-1
qemu-system-X -no-rebootOpción QEMU CLI:hace que QEMU salga cuando el invitado intenta reiniciarkernel.panic=-1parámetro de arranque del kernel:hace que Linux intente reiniciarse inmediatamente después de un pánico:https://github.com/torvalds/linux/blob/v4.17/Documentation/admin-guide/kernel-parameters.txt#L2931
También devuelve 0 como pvpanic , pero tiene las siguientes ventajas:
- no es necesario volver a compilar nada, solo un parámetro de arranque
- funciona en arm y aarch64
-M virtasí como x86, mientras que pvpanic parece específico de x86 ya que está por debajo dearch/x86
Probado con esta configuración.
Rastrear el panic símbolo con GDB
Otra forma de hacerlo podría ser detectar cuándo la dirección del panic se alcanza la función, y luego intente hacer que QEMU se cierre.
Definitivamente puedes romper GDB en panic como se explica en:https://stackoverflow.com/questions/11408041/how-to-debug-the-linux-kernel-with-gdb-and-qemu/33203642#33203642
Pero luego TODO:¿cómo hacer que QEMU salga con el estado 1? Usando monitor quit , desde dentro de GDB, que reenvía quit al monitor QEMU de GDB, se acerca mucho, pero no del todo ya que no sale con el estado 0 .
gem5 hace este seguimiento de forma predeterminada de forma nativa, lo cual es bastante impresionante.
Esto sucede en:https://github.com/gem5/gem5/blob/1da285dfcc31b904afc27e440544d006aae25b38/src/arch/arm/linux/system.cc#L73
Tal vez los desarrolladores de QEMU puedan inspirarse en esta técnica e implementar algo similar.
Tengo algo que funciona:
- Configure (y cree) el núcleo con
CONFIG_PVPANIC=y; esto produce un kernel con soporte compilado para elpvpanicdispositivo. - Invocar
qemu-system-x86_64con el-device pvpanicopción; esto le indica a Qemu que atrape (y salga) de un kernel panic.
Un kernel panic provoca qemu-system-x86_64 para salir con éxito (estado de retorno 0 ), pero al menos ya no se cuelga.
Muchas gracias a @dsstorefile1 por orientarme en la dirección correcta.
Referencias:
- https://cateee.net/lkddb/web-lkddb/PVPANIC.html
- https://github.com/qemu/qemu/blob/master/docs/specs/pvpanic.txt