兩個node控制檯和處理V8引擎崩潰QT5的V8型QJSEngine
可以通過下面的代碼崩潰:如何在流程運行的內存
FATAL ERROR: JS Allocation failed - process out of memory
:
a = []; for (;;) { a.push("hello"); }
節點的輸出墜毀前飛機墜毀前
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
主.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;
}
另請注意,您可以在使用V8 :: SetFatalErrorHandler()中止之前註冊一個回調,儘管這仍然不能讓您展開v8堆棧。您還可以使用--no-hard_abort來控制OS :: Abort(),以使進程安靜地退出(SIGABRT),而不是使用訪問衝突(V8_IMMEDIATE_CRASH())。 (我不確定在哪種情況下調用DebugBreak() - 可能只有在調試器被連接時)。 –