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;
}