【发布时间】:2013-05-28 16:51:45
【问题描述】:
node 控制台和 Qt5 基于 V8 的QJSEngine 都可以通过以下代码崩溃:
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 代码中显示 v8::internal::OS::DebugBreak 调用。如果我将调用 QJSEngine::evaluate 的代码包装到 __try-__except (SEH) 中,那么应用程序不会崩溃,但此解决方案是特定于 Windows 的。
问题:有没有办法在节点和 Qt 应用程序中以独立于平台的方式处理 v8::internal::OS::DebugBreak?
=== QJSEngine 测试代码 ===
开发环境:QtCreator 与 Qt5 和 Windows SDK 7.1,在 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;
}
带有 SEH 的 main.cpp(这不会崩溃,输出“致命异常”):
#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;
}
【问题讨论】:
标签: node.js v8 qt5 seh debugbreak