Vm2: أضف دعمًا لتتبع المكدس "الصحيح" للأخطاء في وضع الحماية

تم إنشاؤها على ٥ أغسطس ٢٠١٧  ·  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

التعليق الأكثر فائدة

مجرد ترك تعليق لإعلام الأشخاص المشتركين في هذه المشكلة - لقد فتحت علاقات عامة ، حتى تتمكن من تتبع التقدم هناك.

ال 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 أو شيء من هذا القبيل يمكن دمجه في المشروع؟
شكرا.

باتريك ، هل يبدو مخطط التنفيذ جيدًا بشكل عام؟ إذا كان الأمر كذلك ، يمكنني إجراء علاقات عامة ويمكننا العمل من هناك.

CapacitorSet نعم ، سأكون سعيدًا بمراجعة العلاقات العامة. بعض الملاحظات:

  • طريقة vm.run لا تقبل المعلمة الثانية - ولهذا السبب يتم تجاهل اسم البرنامج النصي. حاليًا ، تحتاج إلى إنشاء VMScript بالاسم المحدد أولاً. لكن يمكن تحسين ذلك بسهولة.
  • هل هناك طريقة لتجنب استخدام الليب الخارجي؟ سيكون من الجيد التمسك بصفر ديس.

مجرد ترك تعليق لإعلام الأشخاص المشتركين في هذه المشكلة - لقد فتحت علاقات عامة ، حتى تتمكن من تتبع التقدم هناك.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات