سيكون من الجيد أن يعرض 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 أو شيء من هذا القبيل يمكن دمجه في المشروع؟
شكرا.
باتريك ، هل يبدو مخطط التنفيذ جيدًا بشكل عام؟ إذا كان الأمر كذلك ، يمكنني إجراء علاقات عامة ويمكننا العمل من هناك.
CapacitorSet نعم ، سأكون سعيدًا بمراجعة العلاقات العامة. بعض الملاحظات:
vm.run
لا تقبل المعلمة الثانية - ولهذا السبب يتم تجاهل اسم البرنامج النصي. حاليًا ، تحتاج إلى إنشاء VMScript بالاسم المحدد أولاً. لكن يمكن تحسين ذلك بسهولة.مجرد ترك تعليق لإعلام الأشخاص المشتركين في هذه المشكلة - لقد فتحت علاقات عامة ، حتى تتمكن من تتبع التقدم هناك.
التعليق الأكثر فائدة
مجرد ترك تعليق لإعلام الأشخاص المشتركين في هذه المشكلة - لقد فتحت علاقات عامة ، حتى تتمكن من تتبع التقدم هناك.