Vm2: Unterstützung für "korrekte" Stack-Traces für Fehler in der Sandbox hinzufügen

Erstellt am 5. Aug. 2017  ·  13Kommentare  ·  Quelle: patriksimek/vm2

Es wäre schön, wenn vm2 "korrekte" Stack-Traces anzeigen könnte, wenn ein Fehler aus der Sandbox ausgegeben wird.

Dies wird beispielsweise derzeit angezeigt:

/home/user/box-js/node_modules/vm2/lib/main.js:213
                        throw this._internal.Decontextify.value(e);
                        ^

Error: foobar
    at Object.log (/home/user/box-js/analyze.js:248:10)
    at Object.apply (/home/user/box-js/node_modules/vm2/lib/contextify.js:288:34)
    at vm.js:491:9
    at ContextifyScript.Script.runInContext (vm.js:53:29)
    at VM.run (/home/user/box-js/node_modules/vm2/lib/main.js:207:72)
    at Object.<anonymous> (/home/user/box-js/analyze.js:383:5)
    at Module._compile (module.js:569:30)
    at Object.Module._extensions..js (module.js:580:10)
    at Module.load (module.js:503:32)
    at tryModuleLoad (module.js:466:12)

Gibt es eine Möglichkeit herauszufinden, welche Zeile (im Sandbox-Code) für den Aufruf der Funktion verantwortlich war, die den Fehler ausgelöst hat?

feature request help wanted

Hilfreichster Kommentar

Ich hinterlasse nur einen Kommentar, um Personen zu benachrichtigen, die dieses Problem abonniert haben. Ich habe eine PR geöffnet, damit Sie den Fortschritt dort verfolgen können.

Alle 13 Kommentare

Das wäre großartig. Ich versuche gerade, einen Codierungsfehler aufzuspüren, und habe es ohne die Zeilennummer teuflisch schwer

Wenn Sie Testfälle ausführen, von denen Sie wissen, dass sie sicher sind, können Sie vm2 vorübergehend durch die native vm ersetzen, um den Fehler aufzuspüren.

Ich würde diese Funktion auch mögen. Ich freue mich, wenn jemand mich in die richtige Richtung weist.

Dieses Problem wurde automatisch als veraltet markiert, da es in letzter Zeit keine Aktivitäten gab. Es wird geschlossen, wenn keine weitere Aktivität stattfindet. Vielen Dank für Ihre Beiträge.

Es stellt sich heraus, dass es nicht trivial ist, vm2 durch Native vm zu ersetzen, da es API-Inkompatibilitäten gibt. Ich hoffe, dies kann offen bleiben!

@patriksimek , ich habe eine einfache Implementierung entwickelt, die auf einem Ausnahme-Parser / Rewriter basiert. Ich denke, es würde sich lohnen, es als optionalen Fehlerbehandler in vm2 zu integrieren.

const StackTracey = require ('stacktracey');
const { VM } = require('vm2');

const sourceCode = `function f() {
    throw Exception('e');
}
f();`;
const scriptName = "hello_world.js";

process.on("uncaughtException",  e => {
    if (!e.stack.includes("/node_modules/vm2/")) {
        // This is not a vm2 error, so print it normally
        console.log(e);
        return;
    }
    const oldStack = new StackTracey(e);
    const newStack = [];
    for (const line of oldStack) {
        // Discard internal code
        if (line.file.includes("/cjs"))
            continue;
        if (line.thirdParty && line.file.includes("/node_modules/vm2/"))
            continue;
        if (line.callee == "Script.runInContext")
            continue;
        // Replace the default filename with the user-provided one
        if (line.fileName == "vm.js")
            line.fileRelative = line.fileShort = line.fileName = scriptName;
        newStack.push(line);
    }
    console.log("[vm2] A clean stack trace follows:");
    console.log(new StackTracey(newStack).pretty);
});

const vm = new VM();
vm.run(sourceCode, scriptName);

Der obige Code würde drucken:

ReferenceError: Exception is not defined
    at f (vm.js:2:2)
    at vm.js:4:1
    at Script.runInContext (vm.js:135:20)
    at VM.run (/tmp/vm2-test/node_modules/vm2/lib/main.js:210:72)
    at Object.<anonymous> (/tmp/vm2-test/index.js:33:4)
    at Module._compile (internal/modules/cjs/loader.js:805:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:816:10)
    at Module.load (internal/modules/cjs/loader.js:672:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:612:12)
    at Function.Module._load (internal/modules/cjs/loader.js:604:3)
[vm2] A clean stack trace follows:
at f            hello_world.js:2
at              hello_world.js:4
at <anonymous>  index.js:33       vm.run(sourceCode, scriptName);

Ich hatte keine Gelegenheit, diese Bibliothek zu testen, aber ich habe kürzlich das VM-Modul verwendet und genaue Stapelverfolgungsnummern erzielt, indem ich beim Erstellen eines neuen VM-Skripts den entsprechenden Zeilenversatz festgelegt habe.

Dieses Problem wurde automatisch als veraltet markiert, da es in letzter Zeit keine Aktivitäten gab. Es wird geschlossen, wenn keine weitere Aktivität stattfindet. Vielen Dank für Ihre Beiträge.

Ich dachte, ich würde einen Kommentar abgeben, da dieses Problem + Vorschläge für mich immer noch relevant sind!

Sehr relevant für mich auch.

@patriksimek Kann die Implementierung von
Vielen Dank.

Patrik, sieht die Implementierungsskizze insgesamt in Ordnung aus? Wenn ja, kann ich PR machen und wir können von dort aus arbeiten.

@CapacitorSet Ja, ich werde gerne eine PR überprüfen. Einige Notizen:

  • Die Methode vm.run akzeptiert den zweiten Parameter nicht - daher wird der Skriptname ignoriert. Derzeit müssen Sie ein VMScript mit dem zuerst angegebenen Namen erstellen. Das kann aber leicht verbessert werden.
  • Gibt es eine Möglichkeit, die Verwendung einer externen Bibliothek zu vermeiden? Wäre schön, bei null Deps zu bleiben.

Ich hinterlasse nur einen Kommentar, um Personen zu benachrichtigen, die dieses Problem abonniert haben. Ich habe eine PR geöffnet, damit Sie den Fortschritt dort verfolgen können.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

XmiliaH picture XmiliaH  ·  19Kommentare

KonradLinkowski picture KonradLinkowski  ·  10Kommentare

unxcepted picture unxcepted  ·  11Kommentare

wojpawlik picture wojpawlik  ·  4Kommentare

keyosk picture keyosk  ·  64Kommentare