Vm2: Ajout de la prise en charge des traces de pile «correctes» pour les erreurs dans le bac à sable

Créé le 5 août 2017  ·  13Commentaires  ·  Source: patriksimek/vm2

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?

feature request help wanted

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.

Tous les 13 commentaires

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:

  • La méthode 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é.
  • Existe-t-il un moyen d'éviter d'utiliser une lib externe? Ce serait bien de s'en tenir à zéro profondeur.

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.

Cette page vous a été utile?
0 / 5 - 0 notes