为什么我的整个 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手动杀手。
我在 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手动杀手。