2012-06-01 5 views
5

पर शीर्ष पर है, मैं एक साधारण विंडो सेवा बना रहा हूं और जब मैं डीबग पर जाता हूं तो मुझे त्रुटि मिलती है, "अभिव्यक्ति का मूल्यांकन नहीं कर सकता क्योंकि मूल फ्रेम कॉल के शीर्ष पर है ढेर।"। साथ ही, जब मैं रिलीज में सेवा बनाता हूं और इसे चलाता हूं तो बस लटकता है।अभिव्यक्ति का मूल्यांकन नहीं कर सकता क्योंकि एक देशी फ्रेम कॉल स्टैक

static void Main() 
    { 
     ServiceBase[] ServicesToRun; 
     ServicesToRun = new ServiceBase[] { new MyService1() }; 

     ServiceBase.Run(ServicesToRun); 
    } 

यही सब है कि Program.cs फ़ाइल है, जहां यह सामान्य रूप से ServiceBase.Run (ServicesToRun) लाइन पर लटका दिया जाता है।

जो कुछ भी मैं ढूंढने में सक्षम हूं, वह केवल अभिव्यक्ति से संबंधित है जिसका मूल्यांकन नहीं किया जा रहा है क्योंकि कोड अनुकूलित किया गया है या एएसपीनेट और प्रतिक्रिया.ऑरेक्ट से निपटने के लिए है।

सेवा के लिए कोड।

public TruckRateClearService() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnStart(string[] args) 
    { 
     tmrProcess.Enabled = true; 
    } 

    protected override void OnCustomCommand(int command) 
    { 
     base.OnCustomCommand(command); 
     if (command == 129) 
     { 
      OnStart(null); 
     } 
    } 

    protected override void OnStop() 
    { 
     tmrProcess.Enabled = false; 
    } 

    private void tmrProcess_Tick(object sender, EventArgs e) 
    { 
     tmrProcess.Enabled = false; 

     try 
     { 
      eventLog.WriteEntry("Clearing Truck Rates Start" + DateTime.Now.ToString()); 

      TruckRateClearingAgent.Process(); 

      eventLog.WriteEntry("Clearing Truck Rates Finished" + DateTime.Now.ToString()); 
     } 
     catch (Exception ex) 
     { 
      eventLog.WriteEntry(ex.ToString(), EventLogEntryType.Error); 
     } 

     tmrProcess.Enabled = true; 
    } 

    internal void Run() 
    { 
     tmrProcess_Tick(tmrProcess, null); 
    } 

आंतरिक शून्य रन() को हाल ही में ईरेन एर्न्सोमेज़ द्वारा टिप्पणियों में दिए गए सुझाव पर जोड़ा गया था। उनका विचार मेरे तर्क को डीबग करने में मदद के लिए बहुत उपयोगी रहा है जब तक कि मैं बाकी को समझ नहीं पाता।

मैं मूल कॉल स्टैक में प्रवेश करने में सक्षम था और यह एक स्थान पर स्थित है, 76F17094 ret। अब मुझे नहीं पता कि यह क्या है लेकिन शायद कोई और करेगा।

इसके अलावा, जब मैं सेवा शुरू करता हूं और इसे वीएस से जोड़ने में देखता हूं तो मैं इसके दो उदाहरण देख रहा हूं। एक सामान्य है। Exe और दूसरा एक .vshost.exe है। जब मैं अन्य सेवाओं को शुरू करता हूं तो मैं केवल डीबगर के हिस्से को संसाधित करने के लिए अटैच में .exe फ़ाइल देखता हूं। ऐसा इसलिए हो सकता है क्योंकि कोई v4 फ्रेमवर्क (.vshost.exe सेवा) पर है और दूसरा v2 (एकल .exe सेवा) फ्रेमवर्क पर है?

मेरा मानना ​​है कि मुझे यह काम मिल गया है। ऐसा लगता है कि समस्या का उपयोग करने वाले टाइमर के साथ समस्या झूठ बोल रही थी। मैं जिस मूल टाइमर का उपयोग कर रहा था वह एक सिस्टम था। Windows.Forms टाइमर। मैंने इसे सिस्टम टिमर्स पर स्विच किया। टिमर्स और सबकुछ फिर से काम करना शुरू कर दिया। अभी भी वीएस को संलग्न नहीं कर सकता है लेकिन मैं आंतरिक रन() विधि का उपयोग करके इसे अभी भी डीबग कर सकता हूं।

उत्तर

2

समस्या

यह सूचना n.n सभी मदद के लिए धन्यवाद मतलब यह है कि धागा वर्तमान में अप्रबंधित कोड निष्पादित हो रहा है, और इसलिए अभिव्यक्ति का मूल्यांकन करने के लिए नहीं किया जा सकता है।

कुछ स्थितियों में, आप अभिव्यक्ति का मूल्यांकन करने से पहले कॉल को प्रबंधित कोड पर वापस आने का इंतजार कर सकते हैं। दुर्भाग्य से, इस स्थिति में, तब तक ऐसा नहीं होगा जब तक आप सेवा बंद नहीं करते।

एक विकल्प

आप ServiceBase.OnCustomCommand विधि अधिभावी और वहाँ एक ब्रेकपाइंट डाल ताकि आप अपने अभिव्यक्ति का मूल्यांकन कर सकते सोच सकते हैं।

protected override void OnCustomCommand(int command) 
{ 
    //Debugger.Break() <- or just put a breakpoint in here. 
} 

आप इस प्रकार के रूप में कस्टम आदेश को लागू कर सकते हैं:

c:\>sc control YourServiceName 129 
+0

मैंने सब कुछ डाला और आदेश को निष्पादित किया और यह काम किया। हालांकि, जब मैं समारोह से बाहर निकल गया तो यह मुझे आगे आगे बढ़ने नहीं देगा। और जब मैं डीबग-> ब्रेक ऑल गया, यह उसी बिंदु पर था जिसमें सेवा विफल रही थी। मुझे लगता है कि मैं यहाँ कुछ गलत कर रहा हूँ। –

+0

आप किस तरह की विफलता देख रहे हैं? एक लटका या अपवाद? –

+0

जैसा कि मैं पहले प्राप्त कर रहा था "अभिव्यक्ति का मूल्यांकन नहीं कर सकता ..."। क्या सेवा बस ServiceBase.Run (ServicesToRun) भाग पर लटका दी जाएगी। –

0

अपवाद आप का मतलब है कि अप्रबंधित कोड एक अपवाद फेंक रहा है देख रहे हैं, तो नेट डिबगर आप हमेशा की तरह नहीं दिखा सकते हैं उपयोगी विवरण

आप MyService1() में क्या कर रहे हैं? क्या आप इसके अंदर कोड पोस्ट कर सकते हैं?

क्या आप इसे पर्यावरण से शुरू करके सेवा को डीबग करने का प्रयास कर रहे हैं। यह काम नहीं कर सकता है।

static void Main(params string[] args) 
{ 
    if (args.Length > 0 && args[0] == "/console") 
    { 
     // Run whatever your service calls here 
    } 
    else 
    { 
     ServiceBase[] ServicesToRun; 
     ServicesToRun = new ServiceBase[] { new MyService1() }; 

     ServiceBase.Run(ServicesToRun); 
    } 
} 

तब डीबग टैब के अंतर्गत परियोजना संपत्तियों में आदेश पंक्ति तर्क के रूप में /console दर्ज करें:

मैं आमतौर पर कुछ इस तरह लिखते हैं। आपको एप्लिकेशन में कदम उठाने और इसे डीबग करने में सक्षम होना चाहिए। आप इसे पहले इंस्टॉल करके केवल एक सेवा डिबग कर सकते हैं: http://msdn.microsoft.com/en-us/library/7a50syb3(v=vs.80).aspx

+0

मैं मूल रूप से सेवा को पुनर्स्थापित कर रहा था और इसे वीएस संलग्न कर रहा था। मैं ईरेन की सलाह देखता हूं और कहा कि मेरे कोड में इसलिए मैं सामान्य डीबगर का उपयोग करने में सक्षम हूं। हालांकि, मुझे अभी तक कोई अप्रबंधित कोड नहीं मिला है। क्या प्रोजेक्ट के गुणों में जाना सुरक्षित होगा और "असुरक्षित कोड की अनुमति दें" चालू करें? –

+0

यहां निर्देशों का प्रयास करें: http://msdn.microsoft.com/en-us/library/tdw0c6sf(v=vs.80).aspx – greg84

2

आपकी मुख्य समस्या यह है कि आप सीधे विंडोज़ सेवा exe चलाने की कोशिश कर रहे हैं। विंडोज सेवाएं केवल सेवा नियंत्रण प्रबंधक (एससीएम) के माध्यम से शुरू की जा सकती हैं। आदेश वी.एस. में डिबग करने के लिए सक्षम होने के लिए, मैं कुछ इस तरह की सलाह देते हैं:

static void Main() 
{ 
    if (Environment.UserInteractive) 
    { 
     new MyService1().Run(); 
     Thread.Sleep(Timeout.Infinite); 
    } 
    else 
    { 
     ServiceBase.Run(new ServiceBase[] { new MyService1() }); 
    } 
} 

आप एक MyService1.Run विधि है जो एक नया धागा है कि सेवा पाश चलाता spawns बनाएंगे। साथ ही, आप के भीतर से उसी Run विधि को कॉल करेंगे।

यह योजना एससीएम द्वारा शुरू की जाने पर इसे एक सेवा के रूप में चलाती है, लेकिन इसे वीएस में डीबग होने पर या सामान्य रूप से वीएस के बाहर एक एक्सई के रूप में चलाने के दौरान सामान्य एक्सई की तरह व्यवहार करता है)।