当进程内存不足时如何处理 V8 引擎崩溃

2023-12-28

Both node http://nodejs.org/控制台和基于Qt5的V8QJSEngine http://qt-project.org/doc/qt-5.0/qtqml/qjsengine.html可以通过以下代码崩溃:

a = []; for (;;) { a.push("hello"); }

崩溃前节点的输出:

FATAL ERROR: JS Allocation failed - process out of memory

QJSEngine崩溃前的输出:

#
# Fatal error in JS
# Allocation failed - process out of memory
#

如果我运行我的QJSEngine在调试器下测试应用程序(见下文),它显示在V8代码中调用。如果我包装代码调用QJSEngine::evaluate into __try-__except (SEH http://msdn.microsoft.com/en-us/library/windows/desktop/ms681409%28v=vs.85%29.aspx),那么应用程序就不会崩溃,但此解决方案是 Windows 特定的。

问题:有办法处理吗v8::internal::OS::DebugBreak在节点和 Qt 应用程序中以独立于平台的方式?

=== QJSEngine测试代码===

开发环境:带有 Qt5 和 Windows SDK 7.1 的 QtCreator,在 Windows XP SP3 上

QJSEngineTest.pro:

TEMPLATE = app
QT -= gui
QT += core qml
CONFIG -= app_bundle
CONFIG += console
SOURCES += main.cpp
TARGET = QJSEngineTest

没有 SEH 的 main.cpp (这会崩溃):

#include <QtQml/QJSEngine>

int main(int, char**)
{
  try {
    QJSEngine engine;
    QJSValue value = engine.evaluate("a = []; for (;;) { a.push('hello'); }");
    qDebug(value.isError() ? "Error" : value.toString().toStdString().c_str());
  } catch (...) {
    qDebug("Exception");
  }
  return 0;
}

main.cpp 与 SEH (这不会崩溃,输出“致命异常”):

#include <QtQml/QJSEngine>
#include <Windows.h>

void runTest()
{
  try {
    QJSEngine engine;
    QJSValue value = engine.evaluate("a = []; for (;;) { a.push('hello'); }");
    qDebug(value.isError() ? "Error" : value.toString().toStdString().c_str());
  } catch (...) {
    qDebug("Exception");
  }
}

int main(int, char**)
{
  __try {
    runTest();
  } __except(EXCEPTION_EXECUTE_HANDLER) {
    qDebug("Fatal exception");
  }
  return 0;
}

我不相信有一种跨平台的方法来捕获 V8 致命错误,但即使有,或者如果有某种方法可以在您关心的所有平台上捕获它们,我不确定这会给您带来什么。

问题是V8使用了记录是否发生致命错误。一旦设置了该标志,V8 将拒绝任何创建新 JavaScript 上下文的尝试,因此无论如何都没有必要继续。在捕获最初的致命错误后尝试执行一些良性的 JavaScript 代码。如果我是对的,你会立即遇到另一个致命错误。

在我看来,正确的做法是 Node 和 Qt 将 V8 配置为从一开始就不会引发致命错误。现在,V8 支持隔离和内存限制,进程终止致命错误不再适用。不幸的是,V8 的错误处理代码似乎尚未完全支持这些新功能,并且仍然假设内存不足情况始终无法恢复。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当进程内存不足时如何处理 V8 引擎崩溃 的相关文章

随机推荐