Как справиться с аварией двигателя V8, когда процессу не хватает памяти
И то и другоеузел консоль и 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::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
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
#include
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;
}