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?
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:
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.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.
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.