2008-10-29 12 views
5

हम LINQ का उपयोग हमारे सिस्टम में बहुत व्यापक रूप से कर रहे हैं। विशेष रूप से LINQ-to-ऑब्जेक्ट्स। तो कुछ स्थानों पर हम स्मृति में एक LINQ क्वेरी को समाप्त करते हैं जो कुछ विशाल अभिव्यक्तियों से बनता है। समस्या तब आती है जब अभिव्यक्तियों में कुछ बग होता है। तो हमें NullReferenceException मिलता है और स्टैक ट्रेस हमें कहीं भी नहीं ले जाता है ([हल्के फ़ंक्शन] तक)। अपवाद को LINQ द्वारा उत्पन्न गतिशील विधि के अंदर फेंक दिया गया था।.NET गतिशील विधियों को डिबग करना

क्या ऐसी गतिशील विधियों को डीबग करने का कोई आसान तरीका है? या मुझे WinDBG सीखने के लिए खुद को बलिदान देना है? :-)

+0

लिंक द्वारा आगे बढ़ाया गया ऑब्जेक्ट्स को आमतौर पर System.Linq.Enumerable के तरीकों को संदर्भित करता है। इनमें गतिशील विधियां शामिल नहीं हैं (लेकिन अज्ञात विधियों को शामिल कर सकते हैं)। क्या आप वास्तव में गतिशील तरीकों का उपयोग कर रहे हैं? –

+0

@ डेविड - मैंने उससे पूछा; Orlangur एकाधिक स्रोतों के साथ एक ही कोड का उपयोग करने के लिए AsQueryable का उपयोग कर रहा है - तो गतिशील तरीकों की उम्मीद है। –

उत्तर

3

यदि आप अपनी अभिव्यक्तियां बना रहे हैं और उन्हें संकलित कर रहे हैं, या AsQueryable का उपयोग कर रहे हैं, तो हाँ; LINQ- जेनरेट की गई विधियां डीबग करने के लिए शाही दर्द होगी।

आप वास्तविक तरीकों के छोटे fragements का उपयोग करके कुछ दर्द को बचा सकता है - कम से कम उपयोगी स्टैक ट्रेस में दिखाई देंगे कुछ ...

एक अन्य विचार है: बल्कि एक विशाल अभिव्यक्ति की तुलना में, यदि आप कर सकते हैं डेज़ी-चेन चीजें थोड़ा और अधिक हो सकती हैं (स्टैक ट्रेस से) जहां यह असफल हो रही है। नकारात्मक प्रदर्शन प्रदर्शन है - एक कहां (foo)। जहां (बार) दो प्रतिनिधि आवेदक हैं, जहां-जहां (foo & & बार) एक हो सकता है।

एक विकल्प विस्तार विधियों के डीबग संस्करण में स्वैप करना हो सकता है; दुर्भाग्य से यह एक छोटे असुविधाजनक है, क्योंकि IQueryable<T> और Queryable एक ही नाम स्थान में रहे हैं ... यह, काम करता है हालांकि ...

आउटपुट पहले:

>Where: x => ((x % 2) = 0) 
<Where: x => ((x % 2) = 0) 
>Count 
'WindowsFormsApplication2.vshost.exe' (Managed): Loaded 'Anonymously Hosted DynamicMethods Assembly' 
<Count 

कोड:

using System; 
using System.Diagnostics; 
using System.Linq.Expressions; 

namespace Demo 
{ 
    using DebugLinq; 
    static class Program 
    { 
     static void Main() 
     { 
      var data = System.Linq.Queryable.AsQueryable(new[] { 1, 2, 3, 4, 5 }); 
      data.Where(x => x % 2 == 0).Count(); 
     } 
    } 
} 
namespace DebugLinq 
{ 
    public static class DebugQueryable 
    { 
     public static int Count<T>(this System.Linq.IQueryable<T> source) 
     { 
      return Wrap(() => System.Linq.Queryable.Count(source), "Count"); 
     } 

     public static System.Linq.IQueryable<T> Where<T>(this System.Linq.IQueryable<T> source, Expression<Func<T, bool>> predicate) 
     { 
      return Wrap(() => System.Linq.Queryable.Where(source, predicate), "Where: " + predicate); 
     } 
     static TResult Wrap<TResult>(Func<TResult> func, string caption) 
     { 
      Debug.WriteLine(">" + caption); 
      try 
      { 
       TResult result = func(); 
       Debug.WriteLine("<" + caption); 
       return result; 
      } 
      catch 
      { 
       Debug.WriteLine("!" + caption); 
       throw; 
      } 
     } 
    } 
} 
+0

दुर्भाग्यवश वास्तविक तरीके हमारे मामले में एक विकल्प नहीं हैं क्योंकि अभिव्यक्ति बनाने वाले कोड का उपयोग अन्य LINQ प्रदाताओं के साथ भी किया जाता है, इसलिए इसे IQueryable –

+0

के साथ काम करना पर्याप्त है [सोचता है ...] –

+0

अच्छा, मुझे लगता है कि मैं बना सकता हूं विशेष रूप से डीबगिंग के लिए मेरा स्वयं का LINQ-to-ऑब्जेक्ट प्रदाता जो सभी अभिव्यक्तियों का मूल्यांकन क्रमशः चरण-दर-चरण का मूल्यांकन करेगा और क्वेरी करने योग्य विधि कॉल को संख्यात्मक विधि कॉल के साथ प्रतिस्थापित करेगा। इससे समस्या का समाधान होना चाहिए। हालांकि एक आसान काम खुद नहीं है। वास्तव में –

1

यदि आप LINQ से ऑब्जेक्ट्स का उपयोग कर रहे हैं, तो मुझे गतिशील विधियां बनाने की उम्मीद नहीं होगी। मैं उन्हें LINQ से SQL के साथ अपेक्षा करता हूं। क्या आप एक उदाहरण दे सकते हैं जहां आप इसे देख रहे हैं?

LINQ की बात होने पर मेरे पास वास्तव में कोई अच्छी डीबगिंग युक्तियाँ नहीं हैं, लेकिन मुझे यकीन है कि एमएस दर्द के बिंदु के बारे में इस बारे में जानता है। क्या मैं सुझाव दे सकता हूं कि आप VS2010 CTP आज़माएं और देखें कि यह बेहतर है या नहीं? आपकी तत्काल समस्या को हल करने के लिए वीएस में सुधार के लिए और अधिक, स्वीकार्य रूप से।

+0

LINQ से ऑब्जेक्ट्स तक मेरा मतलब है कि AsQueryable() –

+0

के माध्यम से इन-मेमोरी संग्रह का उपयोग करना तो क्यों AsQueryable? * आम तौर पर * IENumerable सरल है, और इसका मतलब है कि सरल लैम्ब्डा सीधे उपयोग किया जा सकता है। आप अभी भी उपयोग कर सकते हैं। अपने मैन्युअल रूप से निर्मित लैम्ब्डा का उपयोग करने के लिए ... –

+0

(आह सही, आपने मेरी पोस्ट पर उत्तर दिया) –

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