Umgang mit dem Absturz von V8-Engines, wenn der Prozess nicht mehr ausreicht

8

Sowohl die Knoten Konsole als auch die V8-basierte Version von Qt5 QJSEngine kann durch den folgenden Code abgestürzt sein:

%Vor%

Knotenausgabe vor dem Absturz:

%Vor%

QJSEngine gibt die Ausgabe vor dem Absturz aus:

%Vor%

Wenn ich meine QJSEngine test App (siehe unten) unter einem Debugger starte, wird v8::internal::OS::DebugBreak Aufruf innerhalb des V8-Codes. Wenn ich den Code umbringe, der QJSEngine::evaluate in __try-__except aufruft ( SEH ), dann stürzt die App nicht ab, aber diese Lösung ist Windows-spezifisch.

Frage: Gibt es eine Möglichkeit, in Knoten- und Qt-Anwendungen plattformunabhängig mit v8::internal::OS::DebugBreak umzugehen?

=== QJSEngine Testcode ===

Entwicklungsumgebung: QtCreator mit Qt5 und Windows SDK 7.1, auf Windows XP SP3

QJSEngineTest.pro:

%Vor%

main.cpp ohne SEH (das wird abstürzen):

%Vor%

main.cpp mit SEH (dies stürzt nicht ab, gibt "Fatal exception" aus):

%Vor%     
kol 28.05.2013, 16:51
quelle

1 Antwort

3

Ich glaube nicht, dass es einen plattformübergreifenden Weg gibt, fatale V8-Fehler einzufangen, aber selbst wenn es da wäre, oder wenn es eine Möglichkeit gäbe, sie auf allen Plattformen, die Ihnen wichtig sind, einzufangen, bin ich mir nicht sicher würde dich kaufen.

Das Problem ist, dass V8 ein verwendet globales Flag , das aufzeichnet, ob ein schwerwiegender Fehler aufgetreten ist. Sobald dieses Flag gesetzt ist, wird V8 jeden Versuch, neue JavaScript-Kontexte zu erstellen, ablehnen, so dass es sowieso keinen Sinn macht, weiterzumachen. Versuchen Sie, nach dem Auffangen des ersten schwerwiegenden Fehlers einen gutartigen JavaScript-Code auszuführen. Wenn ich richtig liege, erhalten Sie sofort einen weiteren fatalen Fehler.

Meiner Meinung nach wäre es das Richtige für Node und Qt, V8 so zu konfigurieren, dass keine schwerwiegenden Fehler ausgelöst werden. Da nun V8 Isolierungen und Speicherbeschränkungen unterstützt, sind fatale Fehler beim Prozesstod nicht mehr angemessen. Leider sieht es so aus, als ob der Fehlerbehandlungscode von V8 diese neueren Funktionen noch nicht vollständig unterstützt und immer noch mit der Annahme arbeitet, dass Speicherbedingungen immer nicht behebbar sind.

    
BitCortex 11.06.2013, 21:03
quelle

Tags und Links