Vm2: Agregue soporte para rastreos de pila "correctos" para errores en la zona de pruebas

Creado en 5 ago. 2017  ·  13Comentarios  ·  Fuente: patriksimek/vm2

Sería bueno si vm2 pudiera mostrar los seguimientos de pila "correctos" cuando se arroja un error desde la caja de arena.

Por ejemplo, esto es lo que se muestra actualmente:

/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)

¿Hay alguna forma de averiguar qué línea (en el código de espacio aislado) fue responsable de llamar a la función que arrojó el error?

feature request help wanted

Comentario más útil

Solo dejo un comentario para notificar a las personas que están suscritas a este problema: abrí un PR, para que pueda rastrear el progreso allí.

Todos 13 comentarios

Esto sería genial. Estoy tratando de rastrear un error de codificación en este momento y lo estoy pasando terriblemente mal sin el número de línea.

Si está ejecutando casos de prueba que sabe que son seguros, puede reemplazar temporalmente vm2 con la máquina virtual nativa para rastrear el error.

También me gustaría esta función. Feliz de colaborar para escribirlo si alguien me indica la dirección correcta.

Este problema se ha marcado automáticamente como obsoleto porque no ha tenido actividad reciente. Se cerrará si no se produce más actividad. Gracias por sus aportaciones.

Resulta que no es trivial reemplazar vm2 con Native vm ya que hay incompatibilidades de API, ¡espero que esto pueda permanecer abierto!

@patriksimek ,

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);

El código anterior se imprimiría:

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);

No he tenido la oportunidad de probar esta biblioteca, pero recientemente usé el módulo vm y logré números de seguimiento de pila precisos al establecer el desplazamiento de línea apropiado al crear un nuevo vm.Script.

Este problema se ha marcado automáticamente como obsoleto porque no ha tenido actividad reciente. Se cerrará si no se produce más actividad. Gracias por sus aportaciones.

¡Pensé que comentaría ya que este problema y las sugerencias siguen siendo relevantes para mí!

Muy relevante para mí también.

@patriksimek ¿ Se puede integrar en el proyecto la implementación de
Gracias.

Patrik, ¿el esquema de implementación se ve bien en general? Si es así, puedo hacer un PR y podemos trabajar desde allí.

@CapacitorSet Sí, estaré feliz de revisar un PR. Algunas notas:

  • El método vm.run no acepta el segundo parámetro, por eso se ignora el nombre del script. Actualmente, debe crear un VMScript con el nombre especificado primero. Pero eso se puede mejorar fácilmente.
  • ¿Hay alguna forma de evitar el uso de bibliotecas externas? Sería bueno quedarse con cero deps.

Solo dejo un comentario para notificar a las personas que están suscritas a este problema: abrí un PR, para que pueda rastrear el progreso allí.

¿Fue útil esta página
0 / 5 - 0 calificaciones