Quando nel kernel avviene un fallimento di qualsiasi tipo (system fault), tale fallimento viene informalmente chiamato OOPS (nome tratto proprio da ciò che si esclama quando accade qualche guaio). Vengono compiute le seguenti azioni: - Il kernel aggiunge in fondo al kernel log un messaggio per informare dell'accaduto: il cosiddetto messaggio di (errore per il) kernel oops. - kill del processo interessato, per poter continuare l'esecuzione del sistema, esecuzione che però non è più affidabile - se le risorse necessarie per andare avanti non sono più disponibili, a causa del kill del processo, allora si ha un cosiddetto KERNEL PANIC; diventa necessario un reboot (automatico o con comando dell'utente). Il messaggio di oops contiene informazioni fondamentali per cercare l'errore che ha causato il fallimento: - Che fallimento si è verificato - Dove si è verificato il fallimento - Stack trace che ha portato fino all'esecuzione dell'istruzione che ha causato il fallimento I BUG_ON aiutano tantissimo nel controllo di condizioni anomale, perché forzano uno speciale tipo di fallimento, che fa generare al kernel un messaggio di OOPS che contiene il nome del file ed il numero di riga del sorgente in cui si trova il BUG_ON che ha causato il fallimento. Un'aiuto simile è dato dai WARN_ON, che fanno solo generare un messaggio di OOPS, senza alcun kill di processi o fallimento del sistema. Se volete approfondire l'argomento, seguono molti dettagli e link, forniti da Chiara Bruschi. ------------ DETTAGLI E LINK SU KERNEL OOPS (forniti da Chiara Bruschi) - http://opensourceforu.com/2011/01/understanding-a-kernel-oops/ -> "depending on the type of error detected by the kernel" -> "an "Oops" is what the kernel throws at us when it finds something faulty, or an exception" -> "the system may not even resume its normal operations sometimes; this is called unstable state" - per una spiegazione in intesi, anche se poco dettagliata https://en.wikipedia.org/wiki/Linux_kernel_oops - differenza tra kernel oops e kernel panic, https://en.wikipedia.org/wiki/Kernel_panic -> di solito il processo che ha causato l'errore (seguito dal messaggio di kernel oops) viene killato, ma se le risorse necessarie per continuare l'esecuzione (seppur inaffidabile) non sono più disponibili, allora il kernel non può più eseguire ed entra in kernel panic ---------- -> nel mio caso, la divisione per 0 impedisce l'utilizzo del valore di rate calcolato e l'esecuzione non continua, la conseguenza è il freeze della macchina virtuale (dunque accade un kernel panic, non è solamente un kernel oops; infatti nel log l'errore è identificato come "divide error:" e non come "oops"-come indicato nell'esempio del primo link di questo file- e gli ultimi messaggi del log sono proprio "Kernel panic" ---------- -> con kernel oops, il sistema continua ad eseguire, ma non è più affidabile; con kernel panic il sistema ha un "freeze" e aspetta un comando di reboot ---------- -> (dal secondo link di Wikipedia) "kernel panics can also generate another kind of error condition, known as a kernel oops. In this case, the kernel normally continues to run after killing the offending process. As an oops could cause some subsystems or resources to become unavailable, they can later lead to a full kernel panic." - https://www.safaribooksonline.com/library/view/understanding-the-linux/0596005652/ch04s05.html -> "Most exceptions issued by the CPU are interpreted by Linux as error conditions. When one of them occurs, the kernel sends a signal to the process that caused the exception to notify it of an anomalous condition. If, for instance, a process performs a division by zero, the CPU raises a "Divide error " exception" -> "In order to avoid data corruption on the hard disks, the handler invokes the die( ) function, which prints the contents of all CPU registers on the console (this dump is called kernel oops) and terminates the current process by calling do_exit( )" - https://www.usenix.org/conference/hotdep12/workshop-program/presentation/yoshimura - https://wiki.ubuntu.com/DebuggingKernelOops - dalla documentazione ufficiale, http://elixir.free-electrons.com/linux/v4.1/source/Documentation/oops-tracing.txt