9

आज मैं कुछ कोड का डिबगिंग कर रहा था जो कुछ अभिव्यक्तियों को बनाता है, उन्हें कॉल करने योग्य प्रतिनिधियों के लिए संकलित करता है और यदि आवश्यक हो तो उन्हें बाद में कॉल करता है। जबकि यह कर मैं कोड के माध्यम से कदम एक FatalExecutionEngineError का सामना करना पड़ा:सी # अभिव्यक्तियां - FatalExecutionEngineError

FatalExecutionEngineError

पहले तो मुझे के बाद से मुझे पता नहीं मेरी भाव के साथ संभवतः गलत हो सकता था क्या था एक छोटा सा झटका लगा, वे सब ठीक लग रही थी। तब मुझे पता चला है कि यह केवल निम्न स्थिति में होता है:

  • Method A एक स्थिर विधि है कि कहा जाता है और ExpressionTree, जो संभवतः Method A के लिए एक Expression.Call() फिर से शामिल कर सकते हैं उत्पन्न कर रहा है। तो जब मैं अभिव्यक्ति ट्री के लिए लैम्ब्डा संकलित करता हूं, जनरेटेड प्रतिनिधि (चलिए इसे Method B कहते हैं) यदि संभवतः मैं इस विधि से इसे कॉल करता हूं तो रिकर्सन संभव हो सकता है ... (Method A ->[Generated]Method B ->Method A)।

  • ... जो मेरे परिदृश्य में पूरी तरह से संभव है। जैसा कि ऊपर वर्णित है, मैं कोड के इस टुकड़े को डीबग कर रहा था, इसलिए मैंने Method A में ब्रेकपॉइंट सेट किया।

  • पहली बार Method A नियमित कोड द्वारा बुलाया जाता है, ब्रेकपॉइंट सामान्य रूप से हिट होता है। जब Method B कहा जाता है, ब्रेकपॉइंट दूसरी बार हिट करता है, फिर भी सब कुछ ठीक है।

  • लेकिन जैसे ही मैं अंतिम पंक्ति से अधिक कदम से डिबगर के साथ दूसरे कॉल समाप्त किए जाने के रूप में, FatalExecutionEngineError होता है।

अगर मैं डिबगिंग के बिना कोड चलाते हैं, या Method A को पुनरावर्ती कॉल में कदम नहीं है, या अगर मैं विधि की अंतिम पंक्ति पर कदम नहीं है, समस्या नहीं होती है और मेरी अभिव्यक्ति कोड है अपेक्षित के रूप में निष्पादित।

मैं यह निर्धारित नहीं कर सकता कि यह वीएस-डीबगर या .NET Framework में कोई त्रुटि है, या यदि मैं कुछ गंभीरता से करता हूं, तो गलत गलत है जो प्रासंगिक लाइनों को डीबग करते समय ही आता है।

यहां एक बहुत ही कठिन उदाहरण कोड है जिसे आप बॉक्स से बाहर चला सकते हैं। मैं विजुअल स्टूडियो 2013 प्रो अपडेट 4 और .NET 4.5.1 का उपयोग कर रहा हूं। बस DoSomething() में ब्रेकपॉइंट सेट करें और अंत तक कदम उठाने का प्रयास करें - यदि आप कर सकते हैं;)

क्या कोई भी बग की पुष्टि कर सकता है, या मेरा अभिव्यक्ति खराब है?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Linq.Expressions; 
using System.Reflection; 
using System.Text; 
using System.Threading.Tasks; 

namespace ExpressionProblem 
{ 
    public class MainClass 
    { 
     public static void DoSomething(bool stop) 
     { 
      var method = typeof(MainClass).GetMethod(
       "DoSomething", 
       BindingFlags.Public | BindingFlags.Static, 
       Type.DefaultBinder, 
       new Type[] { typeof(bool) }, 
       null); 

      var expParam = Expression.Parameter(typeof(bool), "stop"); 
      var expCall = Expression.Call(null, method, expParam); 
      var lambda = Expression.Lambda(expCall, expParam); 
      var @delegate = lambda.Compile(); 
      if(!stop) 
      { 
       @delegate.DynamicInvoke(true); 
      } 
     } 

     public static void Main(string[] args) 
     { 
      DoSomething(false); 
     } 
    } 
} 
+0

वाह! यह काम करता है/विस्फोट! :-) – xanatos

+0

मैं एक ही बात है जब VS2012 या VS2010 का उपयोग कर, लेकिन केवल जब कदम का वर्णन का उपयोग कर मिलता है। यह केवल तभी उड़ाता है जब मैं '@ प्रतिनिधि। डायनामिक इनवोक 'में कदम रखता हूं, फिर आगे बढ़ना जारी रखता हूं (इसे चलाने की अनुमति नहीं देता)। – Shlomo

+2

चूंकि यह डिबगिंग नहीं करते समय ठीक चलता है, मुझे लगता है कि यह डीबगर के साथ एक समस्या है। – Shlomo

उत्तर

6

आपका रेपो कोड उत्कृष्ट है, यह बम विश्वसनीय है। यह 32-बिट कोड के लिए v4 डिबगिंग इंजन के लिए बेहद विशिष्ट है, यह v2 इंजन या 64-बिट डीबगर इंजन के लिए नहीं होता है। पुराने और नए वी 4 इंजन दोनों में यह समस्या है।

जब मैं डीबगर डीबग करता हूं तो मुझे कुछ भी पहचानने योग्य नहीं लगता है, जो कोड विफल रहता है, वह एक स्पष्ट फेंक के साथ mscorlib.dll में स्थित है। कुछ भी परिचित नहीं है, मुझे ILTree नामक एक अप्रबंधित कक्षा में कुछ संकेत दिखाई देते हैं। माइक्रोसॉफ्ट हमारे साथ साझा नहीं करता है, यह संदर्भ स्रोत, एसएससीएलआई 20 या कोरसीएलआर स्रोत कोड में मौजूद नहीं है।

माइक्रोसॉफ्ट के बारे में चिंता करने के लिए यह कुछ है। कनेक्ट के माध्यम से बग की रिपोर्ट करें।microsoft.com। इस SO प्रश्न का एक लिंक इसे दस्तावेज करने के लिए पर्याप्त होना चाहिए। अगर आप इसे करने के लिए समय नहीं लेना चाहते हैं तो मुझे बताएं और मैं इसका ख्याल रखूंगा।

इस बीच आप घबराना मजबूर कर निकाल कर बस को अपने सभी कार्यक्रम 64-बिट मोड में चलाने के लिए जा रहा रखने के लिए, एक सभ्य वैकल्पिक हल है। प्रोजेक्ट + प्रॉपर्टीज, टैब बनाएं, "32-बिट पसंद करें" विकल्प को अनचेक करें और प्लेटफ़ॉर्म लक्ष्य के लिए AnyCPU का चयन करें। जब आप माइक्रोसॉफ्ट से वापस सुनते हैं तो कृपया फ़ॉलो करें।

+4

आपको बहुत धन्यवाद हंस। हर मैं एक मुद्दा पहले चुप खड़े हैं, आप अचानक इस तरह के विस्तृत विश्लेषण के साथ में चार्ज आ :) मैं बग रिपोर्ट यहाँ प्रस्तुत की है: https://connect.microsoft.com/VisualStudio/feedback/details/1148770 – PuerNoctis

संबंधित मुद्दे