kol*_*kol 8 v8 debugbreak seh node.js qt5
这两个节点控制台和QT5的V8为基础QJSEngine可以通过以下代码崩溃:
a = []; for (;;) { a.push("hello"); }
Run Code Online (Sandbox Code Playgroud)
崩溃前节点的输出:
FATAL ERROR: JS Allocation failed - process out of memory
Run Code Online (Sandbox Code Playgroud)
QJSEngine崩溃前的输出:
#
# Fatal error in JS
# Allocation failed - process out of memory
#
Run Code Online (Sandbox Code Playgroud)
如果我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
Run Code Online (Sandbox Code Playgroud)
没有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;
}
Run Code Online (Sandbox Code Playgroud)
带有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;
}
Run Code Online (Sandbox Code Playgroud)
我不相信有一种跨平台的方法来捕获 V8 致命错误,但即使有,或者如果有某种方法可以在您关心的所有平台上捕获它们,我不确定这会给您带来什么。
问题是V8使用了一个全局标志来记录是否发生了致命错误。一旦设置了该标志,V8 将拒绝任何创建新 JavaScript 上下文的尝试,因此无论如何都没有必要继续。在捕获最初的致命错误后尝试执行一些良性的 JavaScript 代码。如果我是对的,你会立即遇到另一个致命错误。
在我看来,正确的做法是 Node 和 Qt 将 V8 配置为从一开始就不会引发致命错误。现在,V8 支持隔离和内存限制,进程终止致命错误不再适用。不幸的是,V8 的错误处理代码似乎尚未完全支持这些新功能,并且仍然假设内存不足情况始终无法恢复。
| 归档时间: |
|
| 查看次数: |
3471 次 |
| 最近记录: |