ΠΡΠ»ΠΎ Π±Ρ Π½Π΅ΠΏΠ»ΠΎΡ ΠΎ, Π΅ΡΠ»ΠΈ Π±Ρ 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)
ΠΡΡΡ Π»ΠΈ ΡΠΏΠΎΡΠΎΠ± Π²ΡΡΡΠ½ΠΈΡΡ, ΠΊΠ°ΠΊΠ°Ρ ΡΡΡΠΎΠΊΠ° (Π² ΠΈΠ·ΠΎΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅) Π±ΡΠ»Π° ΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½Π° Π·Π° Π²ΡΠ·ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ, Π²ΡΠ·Π²Π°Π²ΡΠ΅ΠΉ ΠΎΡΠΈΠ±ΠΊΡ?
ΠΡΠΎ Π±ΡΠ»ΠΎ Π±Ρ Π·Π΄ΠΎΡΠΎΠ²ΠΎ. Π― ΠΏΡΡΠ°ΡΡΡ ΠΎΡΡΠ»Π΅Π΄ΠΈΡΡ ΠΎΡΠΈΠ±ΠΊΡ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΡΠΌΠΎ ΡΠ΅ΠΉΡΠ°Ρ, ΠΈ ΠΌΠ½Π΅ ΡΠ΅ΡΡΠΎΠ²ΡΠΊΠΈ ΡΡΡΠ΄Π½ΠΎ Π±Π΅Π· Π½ΠΎΠΌΠ΅ΡΠ° ΡΡΡΠΎΠΊΠΈ
ΠΡΠ»ΠΈ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ ΡΠ΅ΡΡΠΎΠ²ΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅, ΠΊΠ°ΠΊ Π²Π°ΠΌ ΠΊΠ°ΠΆΠ΅ΡΡΡ, Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½Ρ, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ 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, ΡΠ°ΠΊ ΡΡΠΎ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°ΡΡ ΡΠ°ΠΌ ΠΏΡΠΎΠ³ΡΠ΅ΡΡ.
Π‘Π°ΠΌΡΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ
ΠΡΠΎΡΡΠΎ ΠΎΡΡΠ°Π²ΡΡΠ΅ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ, ΡΡΠΎΠ±Ρ ΡΠ²Π΅Π΄ΠΎΠΌΠΈΡΡ Π»ΡΠ΄Π΅ΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Π½Ρ Π½Π° ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ - Ρ ΠΎΡΠΊΡΡΠ» PR, ΡΠ°ΠΊ ΡΡΠΎ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°ΡΡ ΡΠ°ΠΌ ΠΏΡΠΎΠ³ΡΠ΅ΡΡ.