首页 > 解决方案 > 为什么我的整个 Ubuntu 系统在 Firefox 中的错误 javascript 代码上冻结?

问题描述

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

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

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

不仅我的 Firefox 会说“此页面不正常,请关闭它吗?” 但系统本身并没有说“这个 Firefox 不行,杀了它?”

我得到一个完整的系统冻结没有任何恢复的机会。我能做的就是 Alt+SysRq+REIUSB。因此,在 1978 年多次重新启动后,调试我的代码成为一个问题,未能保存代码意味着丢失它。对我来说这听起来很疯狂。

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

UPD:我还跑去sudo stress --cpu 4检查在 100% 负载下会发生什么。系统不会冻结。

所以,问题。我究竟做错了什么?为什么我的操作系统或 Firefox 不拦截这些冻结?

标签: javascriptubuntufirefoxfreeze

解决方案


正如您所期望的那样,Firefox 应该提示您停止脚本,因为它是一个无限循环,使时间远离 UI,并且应该有可能以任何一种方式终止 Firefox 进程。但是,如果脚本使用越来越多的内存,那可能会成为更大的问题。根据我的经验,Linux 不能很好地处理 OOM 条件,尤其是在较旧的内核版本中——例如 Ubuntu 可能仍在运行的内核版本。

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


推荐阅读