Vm2: Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Β«ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Ρ…Β» трассировок стСка для ошибок Π² пСсочницС

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 5 Π°Π²Π³. 2017  Β·  13ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: patriksimek/vm2

Π‘Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ, Ссли Π±Ρ‹ vm2 ΠΌΠΎΠ³ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ Β«ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅Β» трассировки стСка ΠΏΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ошибки ΠΈΠ· пСсочницы.

НапримСр, это Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ сСйчас отобраТаСтся:

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

Π•ΡΡ‚ΡŒ Π»ΠΈ способ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, какая строка (Π² ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅) Π±Ρ‹Π»Π° отвСтствСнна Π·Π° Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π²Ρ‹Π·Π²Π°Π²ΡˆΠ΅ΠΉ ΠΎΡˆΠΈΠ±ΠΊΡƒ?

feature request help wanted

Π‘Π°ΠΌΡ‹ΠΉ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

ΠŸΡ€ΠΎΡΡ‚ΠΎ ΠΎΡΡ‚Π°Π²ΡŒΡ‚Π΅ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²Π΅Π΄ΠΎΠΌΠΈΡ‚ΡŒ людСй, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ подписаны Π½Π° эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ - я ΠΎΡ‚ΠΊΡ€Ρ‹Π» PR, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΌ прогрСсс.

ВсС 13 ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π­Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π·Π΄ΠΎΡ€ΠΎΠ²ΠΎ. Π― ΠΏΡ‹Ρ‚Π°ΡŽΡΡŒ ΠΎΡ‚ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ кодирования прямо сСйчас, ΠΈ ΠΌΠ½Π΅ чСртовски Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π±Π΅Π· Π½ΠΎΠΌΠ΅Ρ€Π° строки

Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ тСстовыС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, ΠΊΠ°ΠΊ Π²Π°ΠΌ каТСтся, бСзопасны, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ vm2 Π½Π° собствСнный vm, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ.

МнС Ρ‚ΠΎΠΆΠ΅ Π½ΡƒΠΆΠ½Π° эта функция. Π― Ρ€Π°Π΄ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π΅Π³ΠΎ, Ссли ΠΊΡ‚ΠΎ-Ρ‚ΠΎ ΡƒΠΊΠ°ΠΆΠ΅Ρ‚ ΠΌΠ½Π΅ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅.

Π­Ρ‚Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π±Ρ‹Π»Π° автоматичСски ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Π° ΠΊΠ°ΠΊ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ°Ρ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² послСднСС врСмя Π½Π΅ Π±Ρ‹Π»ΠΎ активности. Он Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΊΡ€Ρ‹Ρ‚, Ссли большС Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ активности. Бпасибо Π·Π° ваш Π²ΠΊΠ»Π°Π΄.

Оказалось, Ρ‡Ρ‚ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ vm2 Π½Π° Native vm Π½Π΅Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½ΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π΅ΡΡ‚ΡŒ нСсовмСстимости api, надСюсь, это останСтся ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ!

@patriksimek , я Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π» ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π½Π° основС парсСра / пСрСзаписчика ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ. Π”ΡƒΠΌΠ°ΡŽ, стоит ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² vm2 ΠΊΠ°ΠΊ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ошибок.

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

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠ΄ Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚:

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

Π£ мСня Π½Π΅ Π±Ρ‹Π»ΠΎ возмоТности ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ эту Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ, Π½ΠΎ я Π½Π΅Π΄Π°Π²Π½ΠΎ использовал ΠΌΠΎΠ΄ΡƒΠ»ΡŒ vm ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ» Ρ‚ΠΎΡ‡Π½Ρ‹Π΅ Π½ΠΎΠΌΠ΅Ρ€Π° трассировки стСка, установив ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ смСщСниС строки ΠΏΡ€ΠΈ создании Π½ΠΎΠ²ΠΎΠ³ΠΎ vm.Script.

Π­Ρ‚Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π±Ρ‹Π»Π° автоматичСски ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Π° ΠΊΠ°ΠΊ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ°Ρ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² послСднСС врСмя Π½Π΅ Π±Ρ‹Π»ΠΎ активности. Он Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΊΡ€Ρ‹Ρ‚, Ссли большС Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ активности. Бпасибо Π·Π° ваш Π²ΠΊΠ»Π°Π΄.

ΠŸΠΎΠ΄ΡƒΠΌΠ°Π», Ρ‡Ρ‚ΠΎ я ΠΏΡ€ΠΎΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ эта ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° + прСдлоТСния всС Π΅Ρ‰Π΅ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ для мСня!

ΠžΡ‡Π΅Π½ΡŒ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ ΠΈ для мСня.

@patriksimek ΠΌΠΎΠΆΠ΅Ρ‚ Π»ΠΈ рСализация
Бпасибо.

ΠŸΠ°Ρ‚Ρ€ΠΈΠΊ, Π² Ρ†Π΅Π»ΠΎΠΌ набросок Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ выглядит Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ? Если Ρ‚Π°ΠΊ, я ΠΌΠΎΠ³Ρƒ ΡƒΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΏΠΈΠ°Ρ€, ΠΈ ΠΌΡ‹ смоТСм Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΎΡ‚Ρ‚ΡƒΠ΄Π°.

@CapacitorSet Π”Π°, я Π±ΡƒΠ΄Ρƒ Ρ€Π°Π΄ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ PR. НСкоторыС примСчания:

  • ΠœΠ΅Ρ‚ΠΎΠ΄ vm.run Π½Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ - поэтому имя скрипта игнорируСтся. Π’ настоящСС врСмя Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ VMScript с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ. Но это ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ.
  • Π•ΡΡ‚ΡŒ Π»ΠΈ способ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ использования внСшнСй Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ? Π‘Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ ΠΏΡ€ΠΈΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ Π½ΡƒΠ»Π΅Π²ΠΎΠΉ Π³Π»ΡƒΠ±ΠΈΠ½Ρ‹.

ΠŸΡ€ΠΎΡΡ‚ΠΎ ΠΎΡΡ‚Π°Π²ΡŒΡ‚Π΅ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²Π΅Π΄ΠΎΠΌΠΈΡ‚ΡŒ людСй, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ подписаны Π½Π° эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ - я ΠΎΡ‚ΠΊΡ€Ρ‹Π» PR, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΌ прогрСсс.

Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ