2015-05-26 10 views
10

मुझे अपने विंडोज सेवा कार्यक्रम के साथ अजीब त्रुटि दिखाई दे रही है। मेरा सेवा कार्यक्रम StartServiceCtrlDispatcher() को main() की शुरुआत में कॉल करता है, लेकिन यह कभी-कभी 1063 (ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) के साथ विफल रहता है।1063 (ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) के साथ विफल होने के लिए StartServiceCtrlDispatcher() का क्या कारण बनता है?

मुझे पता है कि यह त्रुटि तब होती है जब उपयोगकर्ता मैन्युअल रूप से प्रोग्राम (कंसोल प्रोग्राम के रूप में) प्रारंभ करता है। लेकिन, यह मामला नहीं है। मैंने यह त्रुटि उत्पन्न होने पर सेवा प्रोग्राम की मूल प्रक्रिया की जांच करने के लिए एक कोड जोड़ा, और यह services.exe को मूल प्रक्रिया है (मुझे लगता है कि यह मानना ​​सुरक्षित है कि मेरा प्रोग्राम एससीएम द्वारा ठीक से शुरू किया गया था)।

दुर्भाग्य से, इस त्रुटि मेरे देव मशीन पर पुन: पेश नहीं है और अपने आप से यह डिबग नहीं कर सकते, लेकिन त्रुटि लॉग उपयोगकर्ता सिस्टम पर कब्जा कर लिया बताता है:

  • यह समस्या सभी का केवल कुछ% पर हो रहा है इस कार्यक्रम के उपयोगकर्ता।
  • यदि समस्या होती है, तो यह दोहराना प्रतीत नहीं होता है। अगली बार सेवा आमतौर पर सफलतापूर्वक शुरू होती है।
  • जब यह समस्या होती है, StartServiceCtrlDispatcher() असफल होने से पहले लगभग एक सेकंड के लिए स्टाल करता है।

क्या किसी ने भी इसी तरह की त्रुटि देखी है? यदि हां, तो त्रुटि का कारण क्या था?

+0

क्या आपने डबल-चेक किया है कि आप मुख्य थ्रेड से StartServiceCtrlDispatcher को कॉल कर रहे हैं, इसे शुरू करने की प्रक्रिया के कुछ सेकंड के भीतर कहा जा रहा है, और SERVICE_ENTRY_TABLE सरणी सही है? (विशेष रूप से, सुनिश्चित करें कि अंतिम प्रविष्टि {NULL, NULL} है।) –

+0

हां, SERVICE_ENTRY_TABLE ठीक से समाप्त हो गया है। और, समय के बारे में, मैं अपने मूल प्रश्न में उल्लेख करना भूल गया, लेकिन StartServiceCtrlDispatcher() विफलता के बाद, मेरा कोड चेक किया गया टाइम स्टैम्प और आमतौर पर सेवा प्रक्रिया शुरू होने के बाद यह लगभग एक सेकंड (या कम) है। तो, मुझे लगता है कि यह असंभव है कि देरी त्रुटि का कारण बन रही है। –

+0

बहुत विषम। और यदि आप एक सामान्य कारक की पहचान नहीं कर सकते हैं तो डीबग करना बहुत मुश्किल है ताकि आप समस्या को पुन: उत्पन्न कर सकें। एक संभावित कामकाज के रूप में, यदि आप पहली कॉल विफल होने पर शायद दूसरी बार StartServiceCtrlDispatcher() को कॉल करने का प्रयास कर सकते हैं? –

उत्तर

6

जैसा कि आप पहले से ही उत्तर की अनुपस्थिति और Google पर कुछ भी देख सकते हैं, समस्या आम नहीं है। मेरा मानना ​​है कि समस्या आपकी सेवा में है, और यह प्रक्रिया की शुरूआत से StartServiceCtrlDispatcher() पर निष्पादित कोड में है, और संभवतः यह सिस्टम संसाधनों को दूषित करने, संभवतः ढेर या HANDLE के कुछ रूपों को लेता है।

आपको यह सुनकर खेद हो सकता है, लेकिन मुझे आपकी समस्याओं का जादू जवाब नहीं मिलेगा। इसके बजाय, मैं कुछ समस्या निवारण का सुझाव दे सकता हूं।

माइक्रोसॉफ्ट एप्लिकेशन सत्यापनकर्ता भ्रष्टाचार खोजने में अमूल्य है। मेरा सुझाव है कि आप:

  1. इसे अपनी dev मशीन पर इंस्टॉल करें।
  2. अपनी सेवा के exe को जोड़ें।
  3. पहली बार केवल Basics\Heaps का चयन करें।
  4. सहेजें दबाएं। इससे कोई फर्क नहीं पड़ता कि आप एप्लिकेशन सत्यापनकर्ता को खुले रखते हैं।
  5. अपनी सेवा को कुछ बार चलाएं।
  6. यदि यह क्रैश हो जाता है, तो इसे डीबग करें और क्रैश आपकी समस्या को इंगित करेगा।
  7. यदि यह क्रैश नहीं होता है, तो Basics\Handles जोड़ें। Basics\Heaps के विपरीत, यह कभी-कभी "झूठी सकारात्मक" को आग लगा सकता है - कोड में गलतियों जो ज्यादा चोट नहीं पहुंचाती है। वैसे भी, जब आप शिकार पर हैं, तो आप जो कुछ भी पा सकते हैं उसे बेहतर तरीके से ठीक कर देंगे। मैं अधिकतर HANDLE या ऐसा कुछ डबल-फ्री करने के बारे में चिंतित हूं। गलती से सेवा प्रबंधक HANDLE को नि: शुल्क कर सकते हैं निश्चित रूप से आपकी समस्या का कारण बन सकते हैं।
  8. यदि यह अभी भी क्रैश नहीं होता है, तो आप Basics\* में अन्य विकल्पों को आजमा सकते हैं, लेकिन मुझे नहीं लगता कि इससे मदद मिलेगी।
  9. इस बिंदु पर, आप प्रोग्राम के main() और StartServiceCtrlDispatcher() और आपके द्वारा किए जा सकने वाले किसी भी वैश्विक निर्माता के बीच कोड का निरीक्षण करना चाहेंगे। HANDLE के साथ संभावित बफर ओवरफ़्लो और त्रुटियों की तलाश करें।
  10. अगला चरण क्लाइंट की मशीन पर एप्लिकेशन सत्यापनकर्ता स्थापित कर सकता है। इसमें बहुत अधिक नुकसान नहीं होता है, मैं कभी-कभी ऐसा करता हूं जब मुझे त्रुटि नहीं मिलती है।
0

टीआईपी: मैंने कुछ संदेशों को लॉग करने के लिए _wfopen/fwrite/fclose का उपयोग किया था। किसी भी तरह से 183 आंतरिक रूप से फेंक दिया गया था और इस विफलता के लिए अग्रणी था 1063. मैंने लॉगिंग हटा दी और सामान्य रूप से काम करना शुरू कर दिया क्योंकि कुछ भी नहीं हुआ। किसी भी मिनट की त्रुटि आपको इसका नेतृत्व कर सकती है। सेवाओं से शुरू करें और यह मजदूरी त्रुटि (मेरे मामले में 183) सूचीबद्ध करेगा।

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