2012-03-08 14 views
7

मुझे निम्न प्रश्न से परेशान था: "स्थैतिक" लेबल का लाभ कैसे बनाए रखें लेकिन फिर भी साइट पर उत्पादन कोड डीबग करने में सक्षम हो?स्टेटिक बनाम गैर स्टेटिक फ़ंक्शन - एम्बेडेड सिस्टम संदर्भ डीबगिंग

ऐसा नहीं होता है कि ग्राहक साइट पर अनपेक्षित व्यवहार हो रहा है, और केवल वहां। कई मामलों में, डीबग करने का विकल्प होने से बहुत सारे प्रयास बचा सकते हैं और बहुत तेज़ प्रतिक्रिया मिल सकती है। इस तरह के एक डीबग में आमतौर पर कार्य व्यवहार की जांच शामिल होती है, जो हमें "स्थैतिक" परिभाषा में लाती है।

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

मुझे कम से कम दो अलग-अलग बिल्डों को संकलित करने जैसे विकल्पों के बारे में पता है, एक स्थिर और बिना किसी के, लेकिन यह स्वचालन परीक्षणों के साथ अच्छी तरह फिट बैठता है, न कि अंततः अंतिम उत्पादन निर्माण के साथ।

आपकी तरफ से कुछ अंतर्दृष्टि की सराहना की जाएगी, मुख्य रूप से आपने इस दुविधा को कैसे हल किया है (यदि कोई है)। या करने के लिए सवाल अलग ढंग से व्यक्त: "क्या अधिक महत्वपूर्ण है?"

एक अच्छा सी here में "स्थिर" पर चर्चा।

+1

क्या आपका मतलब है कि आप 'स्थिर 'के रूप में घोषित कार्यों में ब्रेकपॉइंट्स सेट करने में सक्षम नहीं हैं? सी में, 'स्थिर' कार्य केवल सामान्य कार्य होते हैं, लेकिन उन्हें अन्य "अनुवाद इकाइयों" से नहीं कहा जा सकता है। उनमें से डीबगिंग, रिमोट या स्थानीय को कुछ भी नहीं रोकना चाहिए, जब तक उन्हें अनुकूलित नहीं किया जाता है। –

+1

आप अपने स्थिर फ़ंक्शन पर वैश्विक सूचक परिभाषित कर सकते हैं और स्थैतिक फ़ंक्शन पर ब्रेकपॉइंट सेट करने के लिए इसके मान का उपयोग कर सकते हैं। संकलक को अप्रयुक्त के रूप में समाप्त करने से रोकने के लिए आप इस सूचक 'अस्थिर' भी बना सकते हैं। –

+0

@ जोचिमपिलबोर्ग जो मुझे पता है, स्थिर कार्य प्रतीक तालिका में प्रवेश नहीं करेंगे (भले ही कंपाइलर का उपयोग करके ध्वजांकित किया गया हो), इसलिए, डिबगिंग संभव नहीं है (ब्रेकपॉइंट की तरह)। – EdwardH

उत्तर

1

कुछ डिबगर्स "स्थिर" फ़ंक्शन डीबग कर सकते हैं। कभी-कभी कॉल साइट पर लाइन में स्थिर फ़ंक्शंस का विस्तार किया जाता है, हालांकि, जो डीबगर की नौकरी को मुश्किल बनाता है, और कुछ डिबगर्स बस छोड़ देते हैं।

(कॉल साइट पर इनलाइन विस्तार वास्तव में "स्थैतिक" के लिए विशिष्ट संपत्ति नहीं है, यह केवल इतना है कि कंपाइलर्स ऐसा करने की अधिक संभावना रखते हैं क्योंकि वे फ़ंक्शन के बारे में "अधिक जानते हैं" - विशेष रूप से, यह नाम दिखाई नहीं दे रहा है वर्तमान अनुवाद इकाई के बाहर है, तो समारोह के कोड पूरी तरह से छोड़ा जा सकता है अपने सभी कॉल्स में लाइन का विस्तार कर रहे हैं)

यह मैक्रो का उपयोग करने के लिए एक बार आम था:।

#ifndef STATIC 
# define STATIC static 
#endif 
... 
STATIC void somefunc() { ... } 

और उसके बाद मैक्रो बारी डीबग बिल्ड के लिए "कुछ नहीं" में। यह बहुत अच्छी तरह से काम करता है, लेकिन इनलाइन विस्तारित होने पर भी स्थिर कार्यों को संभालने के लिए पर्याप्त डीबगर को खोजने के लिए बेहतर है।

+0

मैक्रो इन-हाउस परीक्षण अवधि के लिए समस्या हल करता है, लेकिन समस्या तब होती है जब समस्या ग्राहक साइट पर होती है और केवल वहां होती है। कुछ बार, डीबग संस्करण डालने से समस्या खत्म हो जाएगी। – EdwardH

1

क्या आप सार्वजनिक रूप से सुलभ फ़ंक्शन में ब्रेकपॉइंट डाल सकते हैं जो स्थैतिक फ़ंक्शन को कॉल करता है? फिर आप कम से कम तर्क और वापसी मूल्यों की जांच कर सकते हैं। यदि समस्या केवल ग्राहक साइट पर होती है, और आपके यूनिट परीक्षण/एकीकरण परीक्षण उन कार्यों के लिए समस्याएं नहीं दिखाते हैं जिन्हें आप उन कार्यों को प्राप्त करने की अपेक्षा करते हैं, तो समस्या यह है कि इन कार्यों को इनपुट प्राप्त हो रहा है (या इनपुट का अनुक्रम, यदि फ़ंक्शन किसी भी तरह से राज्यपूर्ण है) आपने अनुमान नहीं लगाया, जिसका अर्थ है कि वास्तविक समस्या उन स्थिर कार्यों के बाहर हो सकती है जिन्हें आप देख रहे हैं।

यदि आपको पहले से ही संदेह है कि आपको पता है कि कौन सा स्थिर कार्य समस्या है, और आप जानते हैं कि आपको किस प्रकार के इनपुट पर संदेह है, तो आप रिलीज में एक साधारण यूनिट परीक्षण फ़ंक्शन डाल सकते हैं ताकि आप बग की जांच कर सकें संदिग्ध। बेशक, यह जटिल हो जाता है यदि यह फ़ंक्शन सीधे नियंत्रित होता है, उदाहरण के लिए एक छः टन क्रेन, जिसमें आपको फ़ंक्शन के दो संस्करण लिखना पड़ सकता है, एक क्रेन को नियंत्रित करने के लिए एक नकली के साथ, और उस पर अपने परीक्षण चलाएं।

कम संभावना है लेकिन असंभव नहीं है, रिलीज और डीबग बिल्ड के बीच एक कंपाइलर असंगतता को कभी भी नकारें। हम सभी को लगता है कि कंपाइलर्स अचूक हैं, मुझे शामिल है, लेकिन सामान होता है।और मैं आपकी प्रतिक्रिया torek करने के लिए कि ग्राहक दे रही है एक डीबग बिल्ड कभी कभी समस्याओं को ठीक करता में देखते हैं ...

+0

मॉड्यूल के एपीआई को डीबग करना हमेशा पर्याप्त नहीं होता है, खासकर जब आप किसी निजी फ़ंक्शन में किसी समस्या पर संदेह करते हैं। मैं आवश्यक परीक्षणों का उपयोग करने के लिए आपके बिंदु से पूरी तरह से सहमत हूं, हालांकि, यह हमेशा एम्बेडेड वातावरण में लागू नहीं होता है। कई बार हम अनुक्रमण और घटनाओं के असीमित हैंडलिंग के बारे में बात कर रहे हैं, जिसमें यूनिट परीक्षण शामिल नहीं हो सकता है। – EdwardH

3

मुझे लगता है कि बुनियादी सवाल नहीं है "आप 'स्थिर' है या नहीं के साथ जहाज है?", यह है "क्या आप वास्तव में परीक्षण करते हैं कि आप को शिप करते हैं?" एम्बेडेड कोड के लिए, यदि आप डीबग बिल्ड पर अपने अधिकांश परीक्षण कर रहे हैं, और उसके बाद अलग-अलग विकल्पों के साथ संकलित संस्करण रिलीज कर रहे हैं, तो आप अनिवार्य रूप से अपने ग्राहक को अनचाहे कोड भेज रहे हैं। जब आप हार्डवेयर के करीब चल रहे हों, तो समय या मेमोरी एक्सेस पैटर्न में छोटे बदलाव (जो ऑप्टिमाइज़र आसानी से पेश कर सकता है) सिस्टम के व्यवहार में बड़े बदलाव कर सकता है।

मेरी वर्तमान रणनीति डीबग संस्करण को शिप करना है, जो अधिक अनुकूलन के लिए कॉन्फ़िगर किया गया है क्योंकि मैं डिबगिंग के दौरान खड़ा हो सकता हूं। कोई स्थिर कार्य नहीं, जितना संभव हो उतना राज्य डीबगर को दिखाई देता है।

हां, मैं कुछ संभावित संकलक-उत्पन्न क्षमताओं को दूर करता हूं, लेकिन जब तक मैं सुनिश्चित करता हूं कि डीबग संस्करण इसकी आवश्यकताओं को पूरा करने के लिए पर्याप्त तेज़ है, यह कोई समस्या नहीं है। और भुगतान यह है कि मैं जिस कोड को शिप करता हूं वह वही कोड है जो मैं पूरे रिलीज चक्र के साथ परीक्षण कर रहा हूं - कोई अनुकूलक-उत्पन्न आश्चर्य नहीं।

+0

यह उल्लेखनीय है कि "स्थैतिक" उपयोग न केवल दक्षता से संबंधित है, यह ऑब्जेक्ट ओरिएंटेड अवधारणा (जैसे उचित पृथक्करण की घोषणा और कार्यान्वयन की तरह कई तरीकों से है, इसलिए अन्य कोडर परिभाषित एपीआई/एस को बाईपास नहीं करेंगे)। आपके नए प्रश्न उठाए गए यहां एक अलग विषय का हकदार है, पर विचार करने के लिए कई पेशेवर और विपक्ष हैं। – EdwardH

+0

संबंधित हेडर से फ़ंक्शन छोड़ना लगभग उतना ही अच्छा है जितना कि यह इन्सापुलेशन और दृश्यता की बात आती है। नामकरण भी मदद कर सकता है।"आप मॉड्यूल 2.c से मॉड्यूल 1DoSomething_private()' क्यों कॉल कर रहे हैं? " समीक्षा में पूछने के लिए एक अच्छा सवाल है ... – AShelly

+1

यह भी देखें http://stackoverflow.com/q/420343/10396 – AShelly