Vm2: ์ƒŒ๋“œ ๋ฐ•์Šค์˜ ์˜ค๋ฅ˜์— ๋Œ€ํ•œ "์˜ฌ๋ฐ”๋ฅธ"์Šคํƒ ์ถ”์ ์— ๋Œ€ํ•œ ์ง€์› ์ถ”๊ฐ€

์— ๋งŒ๋“  2017๋…„ 08์›” 05์ผ  ยท  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์œผ๋กœ ๋Œ€์ฒดํ•˜์—ฌ ์˜ค๋ฅ˜๋ฅผ ์ถ”์  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ €๋„์ด ๊ธฐ๋Šฅ์„ ์›ํ•ฉ๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋‚˜๋ฅผ ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ์•ˆ๋‚ดํ•˜๋ฉด ๊ธ€์„ ์“ธ ์ˆ˜์žˆ์–ด์„œ ๊ธฐ์ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ์ตœ๊ทผ ํ™œ๋™์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž๋™์œผ๋กœ ์˜ค๋ž˜๋œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋” ์ด์ƒ ํ™œ๋™์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉด ํ์‡„๋ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๊ธฐ์—ฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

API ๋น„ ํ˜ธํ™˜์„ฑ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— vm2๋ฅผ Native vm์œผ๋กœ ๋Œ€์ฒดํ•˜๋Š” ๊ฒƒ์€ ์‰ฌ์šด ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค.

@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 ์˜ ๊ตฌํ˜„์ด๋‚˜ ๊ทธ ๋ผ์ธ์— ๋”ฐ๋ฅธ ๋ฌด์–ธ๊ฐ€๋ฅผ ํ”„๋กœ์ ํŠธ์— ํ†ตํ•ฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
๊ฐ์‚ฌ.

Patrik, ๊ตฌํ˜„ ์Šค์ผ€์น˜๊ฐ€ ์ „๋ฐ˜์ ์œผ๋กœ ๊ดœ์ฐฎ์•„ ๋ณด์ž…๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด PR์„ ํ•  ์ˆ˜ ์žˆ๊ณ  ๊ฑฐ๊ธฐ์„œ ์ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@CapacitorSet ์˜ˆ, PR์„ ๊ฒ€ํ† ํ•ด ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์ฐธ๊ณ  ์‚ฌํ•ญ :

  • vm.run ๋ฉ”์†Œ๋“œ๋Š” ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์Šคํฌ๋ฆฝํŠธ ์ด๋ฆ„์ด ๋ฌด์‹œ๋˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ๋Š” ๋จผ์ € ์ง€์ •๋œ ์ด๋ฆ„์œผ๋กœ VMScript๋ฅผ ๋งŒ๋“ค์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ์‰ฝ๊ฒŒ ๊ฐœ์„  ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ œ๋กœ deps๋ฅผ ๊ณ ์ˆ˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•ด ๋Œ“๊ธ€์„ ๋‚จ๊ธฐ๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ์ง„ํ–‰ ์ƒํ™ฉ์„ ์ถ”์  ํ•  ์ˆ˜ ์žˆ๋„๋ก PR์„ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰