QEMU -no-reboot
+ kernel CLI kernel.panic=-1
qemu-system-X -no-reboot
Možnost QEMU CLI:způsobí ukončení QEMU, když se host pokusí restartovatkernel.panic=-1
spouštěcí parametr jádra:způsobí, že se Linux pokusí restartovat okamžitě po panice:https://github.com/torvalds/linux/blob/v4.17/Documentation/admin-guide/kernel-parameters.txt#L2931
Vrátí také 0
jako pvpanic
, ale má následující výhody:
- není třeba nic překompilovat, stačí spouštěcí parametr
- funguje na arm a aarch64
-M virt
stejně jako x86, zatímco pvpanic se zdá být specifický pro x86, protože je podarch/x86
Testováno s tímto nastavením.
Sledujte panic
symbol s GDB
Dalším způsobem, jak toho dosáhnout, může být zjistit, kdy je adresa panic
je dosaženo funkce a poté se pokuste QEMU ukončit.
GDB na panic
určitě prolomíte jak je vysvětleno na:https://stackoverflow.com/questions/11408041/how-to-debug-the-linux-kernel-with-gdb-and-qemu/33203642#33203642
Ale pak TODO:jak ukončit QEMU se stavem 1? Pomocí monitor quit
, zevnitř GDB, která přepošle quit
k monitoru QEMU z GDB se opravdu přiblíží, ale ne tak docela, protože neukončí se stavem 0
.
gem5 provádí toto sledování ve výchozím nastavení nativně, což je docela úžasné.
To se děje na:https://github.com/gem5/gem5/blob/1da285dfcc31b904afc27e440544d006aae25b38/src/arch/arm/linux/system.cc#L73
Možná se vývojáři QEMU mohou touto technikou trochu inspirovat a implementovat něco podobného.
Mám něco, co funguje:
- Nakonfigurujte (a sestavte) jádro pomocí
CONFIG_PVPANIC=y
; tím vznikne jádro se zakompilovanou podporou propvpanic
zařízení. - Vyvolejte
qemu-system-x86_64
s-device pvpanic
volba; to dává Qemu pokyn, aby zachytil (a ukončil) jadernou paniku.
Panika jádra způsobí qemu-system-x86_64
pro úspěšné ukončení (vrácení stavu 0
), ale alespoň už nevisí.
Mnohokrát děkuji @dsstorefile1 za to, že mě ukázal správným směrem.
Reference:
- https://cateee.net/lkddb/web-lkddb/PVPANIC.html
- https://github.com/qemu/qemu/blob/master/docs/specs/pvpanic.txt