आज मैं कुछ कोड का डिबगिंग कर रहा था जो कुछ अभिव्यक्तियों को बनाता है, उन्हें कॉल करने योग्य प्रतिनिधियों के लिए संकलित करता है और यदि आवश्यक हो तो उन्हें बाद में कॉल करता है। जबकि यह कर मैं कोड के माध्यम से कदम एक 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);
}
}
}
वाह! यह काम करता है/विस्फोट! :-) – xanatos
मैं एक ही बात है जब VS2012 या VS2010 का उपयोग कर, लेकिन केवल जब कदम का वर्णन का उपयोग कर मिलता है। यह केवल तभी उड़ाता है जब मैं '@ प्रतिनिधि। डायनामिक इनवोक 'में कदम रखता हूं, फिर आगे बढ़ना जारी रखता हूं (इसे चलाने की अनुमति नहीं देता)। – Shlomo
चूंकि यह डिबगिंग नहीं करते समय ठीक चलता है, मुझे लगता है कि यह डीबगर के साथ एक समस्या है। – Shlomo