Vm2: Tambahkan dukungan untuk pelacakan tumpukan yang "benar" untuk kesalahan di kotak pasir

Dibuat pada 5 Agu 2017  ·  13Komentar  ·  Sumber: patriksimek/vm2

Akan lebih baik jika vm2 bisa menampilkan jejak tumpukan "benar" saat kesalahan dilemparkan dari kotak pasir.

Misalnya, inilah yang sedang ditampilkan:

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

Apakah ada cara untuk mengetahui baris mana (dalam kode kotak pasir) yang bertanggung jawab untuk memanggil fungsi yang memunculkan kesalahan?

feature request help wanted

Komentar yang paling membantu

Hanya meninggalkan komentar untuk memberi tahu orang-orang yang berlangganan masalah ini - Saya membuka PR, sehingga Anda dapat melacak kemajuannya di sana.

Semua 13 komentar

Ini akan luar biasa. Saya mencoba melacak kesalahan pengkodean sekarang dan mengalami kesulitan yang sangat berat tanpa nomor baris

Jika Anda menjalankan kasus pengujian yang Anda yakini aman, Anda dapat mengganti vm2 untuk sementara dengan vm asli untuk melacak error tersebut.

Saya juga suka fitur ini. Senang bisa ikut menulisnya jika seseorang mengarahkan saya ke arah yang benar.

Masalah ini secara otomatis ditandai sebagai usang karena tidak ada aktivitas terbaru. Ini akan ditutup jika tidak ada aktivitas lebih lanjut. Terima kasih atas kontribusi Anda.

Ternyata tidak sepele mengganti vm2 dengan Native vm karena ada api yang tidak kompatibel, semoga ini bisa tetap terbuka!

@patriksimek , saya merancang implementasi sederhana berdasarkan pengecualian parser / rewriter. Saya pikir akan sangat bermanfaat untuk mengintegrasikannya ke dalam vm2 sebagai penangan kesalahan opsional.

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

Kode di atas akan mencetak:

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

Saya belum memiliki kesempatan untuk menguji pustaka ini tetapi saya baru-baru ini menggunakan modul vm dan mencapai nomor pelacakan tumpukan yang akurat dengan mengatur offset baris yang sesuai saat membuat vm.Script baru.

Masalah ini secara otomatis ditandai sebagai usang karena tidak ada aktivitas terbaru. Ini akan ditutup jika tidak ada aktivitas lebih lanjut. Terima kasih atas kontribusi Anda.

Kupikir saya akan berkomentar karena masalah + saran ini masih relevan untuk saya!

Sangat relevan bagi saya juga.

@patriksimek dapatkah implementasi
Terima kasih.

Patrik, apakah sketsa implementasinya terlihat oke secara keseluruhan? Jika demikian saya dapat membuat PR dan kami dapat bekerja dari sana.

@CapacitorSet Ya, dengan senang hati saya akan mengulas PR. Beberapa catatan:

  • Metode vm.run tidak menerima parameter kedua - itulah sebabnya nama skrip diabaikan. Saat ini, Anda perlu membuat VMScript dengan nama yang ditentukan terlebih dahulu. Tapi itu bisa diperbaiki dengan mudah.
  • Apakah ada cara untuk menghindari penggunaan lib eksternal? Akan menyenangkan untuk tetap dengan nol deps.

Hanya meninggalkan komentar untuk memberi tahu orang-orang yang berlangganan masalah ini - Saya membuka PR, sehingga Anda dapat melacak kemajuannya di sana.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

KonradLinkowski picture KonradLinkowski  ·  10Komentar

seanc picture seanc  ·  3Komentar

wintertime-inc picture wintertime-inc  ·  5Komentar

keyosk picture keyosk  ·  64Komentar

XmiliaH picture XmiliaH  ·  19Komentar