ما الذي "لا يمكن تقييم التعبير لأن رمز الطريقة الحالية مُحسّن." يقصد؟

StackOverflow https://stackoverflow.com/questions/131628

سؤال

لقد كتبت بعض التعليمات البرمجية مع الكثير من التكرار، والتي تستغرق وقتًا طويلاً لإكمالها.كلما "أوقف" التشغيل مؤقتًا لإلقاء نظرة على ما يحدث أحصل على:

لا يمكن تقييم التعبير لأنه تم تحسين كود الطريقة الحالية.

أعتقد أنني أفهم ماذا يعني ذلك.ومع ذلك، ما يحيرني هو أنه بعد الضغط على الخطوة، لم يعد الكود "مُحسّنًا" بعد الآن، ويمكنني إلقاء نظرة على المتغيرات الخاصة بي.كيف يحدث هذا؟كيف يمكن أن يقلب الكود ذهابًا وإيابًا بين الكود المحسن وغير المحسن؟

هل كانت مفيدة؟

المحلول

يستخدم المصحح FuncEval للسماح لك "بالنظر إلى" المتغيرات.يتطلب FuncEval إيقاف سلاسل الرسائل في التعليمات البرمجية المُدارة عند نقطة GarbageCollector الآمنة.يؤدي "الإيقاف المؤقت" للتشغيل يدويًا في IDE إلى توقف كافة سلاسل العمليات في أسرع وقت ممكن.سوف يميل الكود التكراري للغاية الخاص بك إلى التوقف عند نقطة غير آمنة.وبالتالي، المصحح غير قادر على تقييم التعبيرات.

سيؤدي الضغط على F10 إلى الانتقال إلى نقطة Funceval Safe التالية وسيمكن من تقييم الوظيفة.

لمزيد من المعلومات قم بمراجعة قواعد FuncEval.

نصائح أخرى

أثناء وجود سطر Debug.Break() أعلى مكدس الاستدعاءات، لا يمكنك تقييم التعبيرات.وذلك لأن هذا الخط هو الأمثل.اضغط على F10 للانتقال إلى السطر التالي - سطر صالح من التعليمات البرمجية - وستعمل الساعة.

من المحتمل أنك تحاول تصحيح أخطاء تطبيقك في وضع الإصدار بدلاً من وضع التصحيح، أو أن التحسينات قيد التشغيل في إعدادات الترجمة لديك.

عندما يتم تجميع التعليمات البرمجية مع التحسينات، يتم التخلص من بعض المتغيرات بمجرد عدم استخدامها في الوظيفة، ولهذا السبب تتلقى هذه الرسالة.في وضع التصحيح مع تعطيل التحسينات، من المفترض ألا يظهر لك هذا الخطأ.

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

لقد نجح هذا بالنسبة لي وتمكنت أخيرًا من تقييم جميع التعبيرات:

  • انتقل إلى المشروع/الخصائص
  • حدد علامة التبويب البناء وانقر فوق "متقدم" ...
  • تأكد من تعيين معلومات التصحيح على "ممتلئة" (وليس PDB فقط)
  • تصحيح مشروعك - فويلا!

ما يلي نجح بالنسبة لي، شكرًا @Vin.

لقد واجهت هذه المشكلة عندما كنت أستخدم VS 2015.بلدي الحل:تم تحديد (تصحيح) التكوين.لقد قمت بحل هذه المشكلة عن طريق إلغاء تحديد Optimize Code الممتلكات ضمن خصائص المشروع.

المشروع (انقر بزر الماوس الأيمن) => الخصائص => البناء (علامة التبويب) => قم بإلغاء تحديد تحسين التعليمات البرمجية

ابحث عن استدعاء دالة مع العديد من المعلمات وحاول تقليل الرقم حتى يعود التصحيح.

تأكد من أنك لا تملك شيئا من هذا القبيل

[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]

في الخاص بك AssemblyInfo

أرسل صديق من Microsoft هذا:http://blogs.msdn.com/rmbyers/archive/2008/08/16/Func_2D00_eval-can-fail-while-stopped-in-a-non_2D00_optimized-managed-method-that-pushes-more-than-256- الوسيطة بايت-.aspx

المشكلة الأكثر احتمالاً هي أن مكدس الاستدعاءات الخاص بك قد تم تحسينه لأن توقيع الطريقة الخاص بك كبير جدًا.

واجهت نفس المشكلة ولكن تمكنت من حلها عن طريق إيقاف تعويض الاستثناء في مصحح الأخطاء.انقر فوق [تصحيح] [الاستثناءات] وقم بتعيين الاستثناءات على "غير معالجة بواسطة المستخدم".

عادةً ما أقوم بإيقاف هذا ولكنه يكون مفيدًا في بعض الأحيان.أريد فقط أن أتذكر إيقاف تشغيله عندما أنتهي.

لقد واجهت هذه المشكلة عندما كنت أستخدم VS 2010.تم تحديد (تصحيح) تكوين الحل الخاص بي.لقد قمت بحل هذه المشكلة عن طريق إلغاء تحديد خاصية تحسين الكود ضمن خصائص المشروع.المشروع (انقر بزر الماوس الأيمن) => الخصائص => البناء (علامة التبويب) => قم بإلغاء تحديد تحسين التعليمات البرمجية

في حالتي كان لدي مشروعان في الحل الخاص بي وكنت أدير مشروعًا لم يكن مشروع بدء التشغيل.عندما قمت بتغييره إلى مشروع بدء التشغيل، بدأ التصحيح في العمل مرة أخرى.

نأمل أن يساعد شخص ما.

تقدير:

في .NET، "تقييم الوظيفة (funceval)" هو قدرة CLR على إدخال بعض الاستدعاءات العشوائية أثناء إيقاف مصحح الأخطاء في مكان ما.يتولى Funceval مسؤولية الخيط الذي اختاره مصحح الأخطاء لتنفيذ الطريقة المطلوبة.بمجرد انتهاء funceval، فإنه يطلق حدث تصحيح.من الناحية الفنية، حدد CLR طرقًا لمصحح الأخطاء لإصدار funceval.

يسمح CLR ببدء funceval فقط على تلك المواضيع الموجودة في نقطة GC الآمنة (أي.عندما لا يحظر الخيط GC) ونقطة Funceval Safe (FESafe) (أي.حيث يستطيع CLR في الواقع القيام بعملية الاختطاف من أجل funceval.) معًا.وبالتالي، فإن السيناريوهات المحتملة لـ CLR، يجب أن يكون الخيط:

  1. توقف في التعليمات البرمجية المُدارة (وفي نقطة آمنة في GC):هذا يعني أننا لا نستطيع القيام بوظيفة في الكود الأصلي.نظرًا لأن الكود الأصلي خارج عن سيطرة CLR، فهو غير قادر على إعداد funceval.

  2. توقف عند الفرصة الأولى أو الاستثناء المُدار غير المعالج (وعند نقطة آمنة في GC):أي في وقت الاستثناء، إجراء الفحص قدر الإمكان لتحديد سبب حدوث هذا الاستثناء.(على سبيل المثال:قد يحاول مصحح الأخطاء تقييم خاصية الرسالة عند الاستثناء المرتفع ورؤيتها.)

بشكل عام، تتضمن الطرق الشائعة للتوقف في التعليمات البرمجية المُدارة التوقف عند نقطة توقف، أو خطوة، أو استدعاء Debugger.Break، أو اعتراض استثناء، أو عند بدء مؤشر ترابط.وهذا يساعد في تقييم الطريقة والتعبيرات.

القرارات المحتملة:بناءً على التقييم، إذا لم يكن الخيط عند نقاط FESafe وGCSafe، فلن يتمكن CLR من اختطاف الخيط لبدء funceval.بشكل عام، يساعد ما يلي في التأكد من بدء الفعالية عند توقعها:

الخطوة 1:

تأكد من أنك لا تحاول تصحيح أخطاء إصدار "الإصدار".تم تحسين الإصدار بالكامل وبالتالي سيؤدي إلى الخطأ في المناقشة.باستخدام شريط الأدوات القياسي أو مدير التكوين، يمكنك التبديل بين التصحيح والإصدار.

الخطوة 2:

إذا استمر ظهور الخطأ، فقد يكون خيار التصحيح مضبوطًا للتحسين.قم بالتحقق من خاصية "تحسين الكود" وإلغاء تحديدها ضمن "خصائص" المشروع:

انقر بزر الماوس الأيمن فوق "خصائص" ، انقر فوق "خصائص" ، انتقل إلى علامة التبويب "بناء" إلغاء تحديد مربع الاختيار "تحسين الرمز"

الخطوه 3:

إذا استمر ظهور الخطأ، فقد يكون وضع معلومات التصحيح غير صحيح.تحقق منه واضبطه على "كامل" ضمن "إعدادات البناء المتقدمة":

انقر بزر الماوس الأيمن فوق "خصائص" ، انقر فوق "خصائص" ، انتقل إلى علامة التبويب "بناء" انقر فوق الزر "المتقدم" تعيين "معلومات التصحيح" على أنها "كاملة"

الخطوة رقم 4:

إذا كنت لا تزال تواجه المشكلة، فجرّب ما يلي:

قم بعمل "نظيف" ثم "إعادة بناء" من ملف الحل الخاص بك أثناء تصحيح الأخطاء:انتقل إلى نافذة الوحدات النمطية (VS MENU -> Debug -> Windows -> الوحدات النمطية) ابحث عن التجميع الخاص بك في قائمة الوحدات المحملة.تحقق من المسار المدرج مقابل التجميع المحمّل هو ما تتوقعه أن يتم التحقق من الطابع الزمني المعدل للملف للتأكيد

خاتمة:

إنه ليس خطأ ولكنه معلومات تستند إلى إعدادات معينة وكما تم تصميمه بناءً على كيفية عمل وقت تشغيل .NET.

في حالتي كنت في وضع الإصدار الذي قمت بتغييره لتصحيح كل شيء يعمل

واجهت مشكلة مماثلة وتم حلها عندما قمت بإنشاء الحل في وضع التصحيح واستبدلت ملف pdb في مسار التنفيذ.

أعتقد أن ما تراه هو نتيجة للتحسينات - في بعض الأحيان سيتم إعادة استخدام متغير - وخاصة تلك التي تم إنشاؤها على المكدس.على سبيل المثال، لنفترض أن لديك طريقة تستخدم عددين صحيحين (محليين).يتم الإعلان عن العدد الصحيح الأول في بداية الطريقة، ويستخدم فقط كعداد للحلقة.يتم استخدام العدد الصحيح الثاني بعد اكتمال الحلقة، ويقوم بتخزين نتيجة العملية الحسابية التي يتم كتابتها لاحقًا في الملف.في هذه الحالة، قد يقرر المحسن إعادة استخدام العدد الصحيح الأول، مع حفظ الكود المطلوب للعدد الصحيح الثاني.عندما تحاول إلقاء نظرة على العدد الصحيح الثاني في وقت مبكر، تحصل على الرسالة التي تسأل عنها "لا يمكن تقييم التعبير".على الرغم من أنني لا أستطيع شرح الظروف الدقيقة، فمن الممكن للمُحسِّن نقل قيمة العدد الصحيح الثاني إلى عنصر مكدس منفصل لاحقًا، مما يؤدي إلى قدرتك على الوصول إلى القيمة من مصحح الأخطاء.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top