2009-09-07 8 views
15

कई बार मैं अनुकूलित कोड (कभी-कभी वेक्टरकृत लूप भी शामिल करता हूं) के साथ काम करता हूं, जिसमें बग और ऐसे होते हैं। इस तरह के कोड को कैसे डिबग किया जाएगा? मैं किसी भी प्रकार के उपकरण या तकनीकों की तलाश में हूं। मैं निम्नलिखित (संभवतः पुराने) टूल का उपयोग करता हूं, इसलिए मैं अपग्रेड करना चाहता हूं।एक अनुकूलित सी/सी ++ प्रोग्राम डीबग करने के कुशल तरीके क्या हैं?

मैं निम्नलिखित का उपयोग करें:

  • ddd साथ के बाद से, आप कोड नहीं देख सकते हैं, मैं gdb + dissambler आदेश का उपयोग करें और उत्पादित कोड देखते हैं; मैं वास्तव में इस कार्यक्रम का उपयोग कर कदम नहीं उठा सकता।
  • ndisasm

धन्यवाद

+0

यह बहुत ही अंतर्दृष्टिपूर्ण नहीं है, लेकिन एमएसडीएन के पास अनुकूलित कोड डिबग करने पर एक लेख है (कम से कम विंडोज़ दुनिया में): http://msdn.microsoft.com/en-us/library/606cbtzs.aspx। – reuben

+0

मुझे नहीं पता कि हमारा कोड मल्टीप्लाटफॉर्म है, लेकिन विजुअल स्टूडियो का उपयोग करके, आप एक कंपाइलर-अनुकूलित प्रोग्राम के साथ-साथ डीबग संस्करण को डीबग कर सकते हैं। कोड, ब्रेकपॉइंट्स, वॉचविंडो इत्यादि के माध्यम से कदम –

+0

यूनिक्स ओएस पर चल रहा है केवल – vehomzzz

उत्तर

19

यह हमेशा अनुकूलित कार्यक्रमों डिबग करने के लिए कठिन है, लेकिन वहाँ हमेशा तरीके हैं। कुछ अतिरिक्त टिप्स:

  • डीबग बिल्ड बनाएं, और देखें कि क्या आपको डीबग बिल्ड में एक ही बग मिलता है या नहीं। अगर आपको ऐसा करने की ज़रूरत नहीं है तो एक अनुकूलित संस्करण को डिबग करना कोई बिंदु नहीं है।
  • अगर इसका समर्थन करने वाले प्लेटफॉर्म पर वालग्रिंड का उपयोग करें। आपके द्वारा देखी जाने वाली त्रुटियों को समझना मुश्किल हो सकता है, लेकिन समस्या को पकड़ना अक्सर डीबगिंग को सरल बनाता है।
  • printf डीबगिंग आदिम है, लेकिन कभी-कभी यह एक आसान तरीका है यदि आपके पास जटिल समस्या है जो केवल अनुकूलित बिल्ड में दिखाई देती है।
  • यदि आपको समय-समय पर समस्या (विशेष रूप से एक बहुप्रचारित कार्यक्रम में) पर संदेह है, तो स्थिति के उल्लंघन के मामले में अपना मूल्यांकन या मुद्रित करें, और संभावित समस्याओं को रद्द करने के लिए इसे कुछ चुनिंदा स्थानों में उपयोग करें।
  • देखें कि क्या आप -फॉमिट-फ्रेम-पॉइंटर्स का उपयोग किए बिना समस्या को पुन: उत्पन्न कर सकते हैं, क्योंकि इससे डीबग करने के लिए कोड बहुत मुश्किल हो जाता है, और -O2 या -O3 सक्षम हो जाता है। इससे आपको आपकी समस्या का कारण खोजने के लिए पर्याप्त जानकारी मिल सकती है।
  • अपने कोड के कुछ हिस्सों को अलग करें, एक परीक्षण-सूट बनाएं, और देखें कि क्या आप किसी भी टेस्टकेस की पहचान कर सकते हैं जो असफल हो। पूरे कार्यक्रम की तुलना में एक समारोह को डीबग करना बहुत आसान है।
  • -fno-X विकल्पों के साथ ऑप्टिमाइज़ेशन को एक-एक करके बंद करने का प्रयास करें। यह आपको सख्त एलियासिंग समस्याओं जैसी सामान्य समस्याओं को खोजने में मदद कर सकता है।
  • अधिक कंपाइलर चेतावनियां चालू करें। सख्त एलियासिंग समस्याओं की तरह कुछ चीजें कंपाइलर चेतावनियां उत्पन्न कर सकती हैं अगर वे विभिन्न अनुकूलन स्तरों के बीच व्यवहार में अंतर डालती हैं।
+2

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

+0

+1 डीबग बिल्ड और वालग्रींड का सुझाव देने के लिए +1 - यह मानते हुए कि आपने एक कंपाइलर बग पर ठोकर नहीं डाला है, एकमात्र कारण यह है कि एक डिज़ाइन बिल्ड विफल होने पर एक अनुकूलित बिल्ड विफल हो जाएगा कि आप पर स्टंप कर रहे हैं स्मृति का एक अलग (और अधिक महत्वपूर्ण) भाग – kdgregory

1

निश्चित रूप से एक गैर-अनुकूलित संस्करण को डीबग करना हमेशा आसान होता है। विफल होने पर, कोड का पृथक्करण सहायक हो सकता है। मैंने उपयोग किए गए अन्य तकनीकों में इंटरमीडिएट परिणामों को मुद्रित या लॉग करने के लिए मजबूती से कोड को आंशिक रूप से डी-ऑप्टिमाइज़ करना शामिल है, या एक महत्वपूर्ण चर को "अस्थिर" में बदलना है, इसलिए मैं कम से कम डीबगर में मान देख सकता हूं।

6

जब डिबगिंग रिलीज बनाता है तो आप __asm ​​nops में डाल सकते हैं; ब्रेकपॉइंट्स (int 3) के लिए प्लेसहोल्डर के रूप में। यह अच्छा है क्योंकि आप कंपाइलर अनुकूलन को गड़बड़ाने या प्रिंटफ/कोउट स्टेटमेंट लिखने के बिना ब्रेकपॉइंट स्थानों की गारंटी दे सकते हैं।

+1

मुझे जीसीसी के बारे में पता नहीं है, लेकिन एमएसवीसी में एक इनलाइन असेंबली ब्लॉक होने से अनुकूलन प्रभावित हो सकता है: "कुछ अन्य कार्य-व्यापी अनुकूलन असेंबली भाषा को शामिल करने से प्रभावित होंगे फ़ंक्शन "- http://msdn.microsoft.com/en-us/library/5hd5ywk0.aspx –

0

संभावना है कि आप अनुकूलित कोड को कॉल करने के लिए स्कैम्बल किए गए हैं (जो डीबगिंग को कठिन बनाता है) लेकिन वास्तव में बहुत अनुकूल नहीं है।Here is an example of what I mean.

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

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