Как справиться с аварией двигателя V8, когда процессу не хватает памяти
Обе,узел консоль и Qt5 на базе V8QJSEngine
может быть разбит следующим кодом:
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::internal::OS::DebugBreak
Звоните внутри кода V8. Если я заверну код вызоваQJSEngine::evaluate
в__try-__except
(SEH), тогда приложение не будет аварийно завершено, но это решение зависит от Windows.
Вопрос: Есть ли способ справитьсяv8::internal::OS::DebugBreak
независимым от платформы способом в приложениях узлов и Qt?
=== 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
main.cpp без SEH (это приведет к сбою):
#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;
}