为什么我的整个 Ubuntu 系统在 Firefox 中的错误 javascript 代码上冻结?

Why does my whole Ubuntu system freeze on buggy javascript code in Firefox?

我在 Ubuntu 18.04 和 19.04(也是全新安装)、Firefox 64 - 66.0.3(全新)中遇到了一个奇怪的问题。我正在编写一些 JavaScript 代码并在我的浏览器中检查它。有时我会犯这样的错误:

for(var i = 0; i < 100;){
   something_else();
}

也就是死循环。上次是 new Regex(...).test() 的正则表达式错误,这显然导致了无限循环......我应该小心,没错,但问题是:

不仅我的 Firefox 会显示类似 'This page is not okay, close it?' 的内容,而且系统本身也不会显示类似 'This Firefox is not okay, kill it?'

的内容

我的系统完全死机,没有任何恢复的机会。我所能做的就是 Alt+SysRq+REIUSB。因此调试我的代码变成了 1978 年的一个问题,多次重启,未能保存代码意味着丢失它。对我来说这听起来很疯狂。

重装Ubuntu几次,在18.04和19.04之间切换,更新软件,都无济于事。 CPU 看起来已经够酷了,没有屏幕闪烁,也没有其他明显的硬件问题。

UPD:我还 运行 sudo stress --cpu 4 检查 100% 负载时会发生什么。系统不卡顿。

所以,问题。我究竟做错了什么?为什么我的 OS 或 Firefox 不拦截那些冻结?

如您所料,Firefox 应该提示您停止脚本,因为它是一个无限循环,使时间远离 UI,并且应该可以通过任何一种方式终止 Firefox 进程。但是,如果脚本 使用越来越多的内存,那问题就大了。根据我的经验,Linux 不能很好地处理 OOM 情况,尤其是在旧内核版本中——例如 Ubuntu 可能仍然存在。

一个有用的工具是 SysRq+F(通过检查 sysctl kernel.sysrq 确保它已启用;值为 1 或设置了第 6 位 – x & 64 ≠ 0 – 表示它是),它运行 OOM手动杀手。