首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >进程耗尽内存时如何处理V8引擎崩溃

进程耗尽内存时如何处理V8引擎崩溃
EN

Stack Overflow用户
提问于 2013-05-28 16:51:45
回答 1查看 4.7K关注 0票数 8

节点控制台和Qt5的基于V8的QJSEngine都可以通过以下代码崩溃:

代码语言:javascript
运行
复制
a = []; for (;;) { a.push("hello"); }

节点崩溃前的输出:

代码语言:javascript
运行
复制
FATAL ERROR: JS Allocation failed - process out of memory

QJSEngine在崩溃前的输出:

代码语言:javascript
运行
复制
#
# Fatal error in JS
# Allocation failed - process out of memory
#

如果我在调试器下运行我的QJSEngine测试应用程序(见下文),它将在V8代码中显示一个v8::internal::OS::DebugBreak调用。如果我将调用QJSEngine::evaluate的代码包装到__try-__except (赛赫)中,那么应用程序不会崩溃,但是这个解决方案是特定于Windows的。

问题:在节点和Qt应用程序中,是否有一种与平台无关的处理v8::internal::OS::DebugBreak的方法?

=== QJSEngine测试代码===

开发环境:在Windows上使用Qt5和WindowsSDK7.1

QJSEngineTest.pro:

代码语言:javascript
运行
复制
TEMPLATE = app
QT -= gui
QT += core qml
CONFIG -= app_bundle
CONFIG += console
SOURCES += main.cpp
TARGET = QJSEngineTest

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

代码语言:javascript
运行
复制
#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;
}

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

代码语言:javascript
运行
复制
#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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-11 21:03:23

我不相信有一种跨平台的方法可以捕获V8致命的错误,但是即使有,或者在你所关心的所有平台上有什么方法来捕获它们,我也不知道这会给你买到什么。

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

在我看来,对Node和Qt来说,正确的做法是首先配置V8以避免引发致命错误。既然V8支持隔离和内存约束,那么杀死进程的致命错误就不再合适了。不幸的是,看起来V8的错误处理代码还没有完全支持这些更新的特性,并且仍然假设内存不足的情况总是无法恢复。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16797423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档