Ce serait bien si vm2 pouvait afficher des traces de pile "correctes" lorsqu'une erreur est renvoyée du bac à sable.
Par exemple, voici ce qui est actuellement affiché:
/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)
Existe-t-il un moyen de déterminer quelle ligne (dans le code sandbox) était responsable de l'appel de la fonction qui a généré l'erreur?
Ce serait génial. J'essaie de localiser une erreur de codage en ce moment et j'ai un moment diaboliquement difficile sans le numéro de ligne
Si vous exécutez des cas de test dont vous savez qu'ils sont sûrs, vous pouvez temporairement remplacer vm2 par le vm natif pour localiser l'erreur.
J'aimerais aussi cette fonctionnalité. Heureux de participer à l'écriture si quelqu'un m'indique dans la bonne direction.
Ce problème a été automatiquement marqué comme obsolète car il n'a pas eu d'activité récente. Il sera fermé si aucune autre activité ne se produit. Merci pour vos contributions.
Il s'avère que ce n'est pas anodin de remplacer vm2 par Native vm car il y a des incompatibilités avec les API, j'espère que cela peut rester ouvert!
@patriksimek , j'ai conçu une implémentation simple basée sur un analyseur / réécriveur d'exceptions. Je pense que cela vaudrait la peine de l'intégrer dans vm2 en tant que gestionnaire d'erreurs optionnel.
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);
Le code ci-dessus imprimerait:
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);
Je n'ai pas eu l'occasion de tester cette bibliothèque, mais j'ai récemment utilisé le module vm et obtenu des numéros de trace de pile précis en définissant le décalage de ligne approprié lors de la création d'un nouveau vm.Script.
Ce problème a été automatiquement marqué comme obsolète car il n'a pas eu d'activité récente. Il sera fermé si aucune autre activité ne se produit. Merci pour vos contributions.
Je pensais que je ferais un commentaire car ce problème + les suggestions sont toujours pertinents pour moi!
Très pertinent pour moi aussi.
@patriksimek peut-il intégrer la mise en œuvre de genre dans le projet?
Merci.
Patrik, l'esquisse d'implémentation semble-t-elle correcte dans l'ensemble? Si c'est le cas, je peux faire un PR et nous pouvons travailler à partir de là.
@CapacitorSet Oui, je serai heureux de revoir un PR. Quelques notes:
vm.run
n'accepte pas le deuxième paramètre - c'est pourquoi le nom du script est ignoré. Actuellement, vous devez créer un VMScript avec le nom spécifié en premier. Mais cela peut être facilement amélioré.Il suffit de laisser un commentaire pour informer les personnes qui sont abonnés à ce problème - j'ai ouvert un PR, afin que vous puissiez suivre la progression là-bas.
Commentaire le plus utile
Il suffit de laisser un commentaire pour informer les personnes qui sont abonnés à ce problème - j'ai ouvert un PR, afin que vous puissiez suivre la progression là-bas.