2008-09-18 12 views
56

बाइनरी निष्पादन योग्य डीबग करने के लिए सी/सी ++ कोड लिखते समय, डिबग विकल्प को कंपाइलर/लिंकर पर सक्षम होना चाहिए। जीसीसी के मामले में, विकल्प है -जी। जब डीबग विकल्प सक्षम होता है, बाइनरी निष्पादन योग्य को कैसे प्रभावित करता है? फ़ाइल में अतिरिक्त डेटा संग्रहीत किया जाता है जो डीबगर फ़ंक्शन को करता है जैसा करता है?डिबगिंग विकल्प कैसे-बाइनरी निष्पादन योग्य बदलें?

उत्तर

53

-g निष्पादन योग्य में प्रतीक तालिका जानकारी संग्रहीत करने के लिए संकलक को बताता है। अन्य बातों के अलावा, इस में शामिल हैं:

  • प्रतीक नाम
  • प्रकार प्रतीकों
  • फ़ाइलें और लाइन नंबर के लिए जानकारी जहां प्रतीकों
  • से आया

Debuggers प्रतीकों के लिए उत्पादन सार्थक नाम करने के लिए इस जानकारी का उपयोग और स्रोत में विशेष लाइनों के साथ निर्देशों को जोड़ने के लिए।

कुछ कंपाइलर्स के लिए, आपूर्ति -g कुछ अनुकूलन अक्षम कर देगा। उदाहरण के लिए, आईसीसी डिफ़ॉल्ट अनुकूलन स्तर को -O0 के साथ सेट करता है जब तक आप स्पष्ट रूप से इंगित नहीं करते- ओ [123]। इसके अलावा, भले ही आप आपूर्ति-ओ [123] करते हैं, स्टैक्स ट्रेसिंग को रोकने वाले अनुकूलन अभी भी अक्षम हो जाएंगे (उदाहरण के लिए स्टैक फ्रेम से फ्रेम पॉइंटर्स को अलग करना। इसका प्रदर्शन पर केवल मामूली प्रभाव पड़ता है)।

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

अधिक जानकारी के लिए, DWARF पर एक नज़र डालें, मूल रूप से ईएलएफ (लिनक्स और अन्य ओएस के लिए बाइनरी प्रारूप) के साथ जाने के लिए डिबगिंग प्रारूप।

+1

बस इसमें जोड़ने के लिए, यह निष्पादन योग्य को भी धीमा कर सकता है। मैं सन स्टूडियो कंपाइलर के साथ कुछ ओपनएमपी कोड का परीक्षण कर रहा था, और डीबगिंग जानकारी के साथ कोड बहुत धीमा हो गया। बस कुछ ध्यान में रखना है। – Mike

+4

जब तक कि सूर्य संकलक में -g ध्वज कुछ अनुकूलन अक्षम नहीं करता है, डीबग जानकारी को आपके कोड को धीमा नहीं करना चाहिए। – tgamblin

+0

यह ओपनएमपी कोड है, और यह इसे धीमा कर देता है। मैं फ्रैक्टल के साथ खेल रहा था, और ओपनएमपी कंपाइलर एक्सटेंशन का उपयोग करने पर काम कर रहा था। एक थ्रेड पर कोड, एक थ्रेड पर गैर ओपनएमपी कोड से धीमा चला गया। मैंने डीबगिंग अक्षम कर दी और गति बराबर हो गई। – Mike

7

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

3

इस question के साथ कुछ ओवरलैप है जो दूसरी ओर से इस मुद्दे को शामिल करता है।

3

बस ब्याज की बात के रूप में, आप एक हेक्सेडिटर खोलने को क्रैक कर सकते हैं और -g और बिना किसी निष्पादन योग्य निष्पादन योग्य को देख सकते हैं। आप जोड़े गए प्रतीक और चीजें देख सकते हैं। यह असेंबली (-S) भी बदल सकता है, लेकिन मुझे यकीन नहीं है।

6

-g निष्पादन योग्य में डिबगिंग जानकारी जोड़ता है, जैसे चर के नाम, कार्यों के नाम, और रेखा संख्याएं। यह एक डीबगर की अनुमति देता है, जैसे जीडीबी लाइन द्वारा कोड लाइन के माध्यम से कदम, ब्रेकपॉइंट सेट करें, और चर के मानों का निरीक्षण करें। इस अतिरिक्त जानकारी के कारण -g निष्पादन योग्य के आकार को बढ़ाता है।

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

8

डिबगिंग और प्रतीक जानकारी
गूगल बौना (ELF पर एक डेवलपर मजाक)

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

लेकिन सबसे महत्वपूर्ण अंतर (मेरी राय में)
डीबग बिल्ड में मेमोरी आमतौर पर डिबगिंग की सुविधा के लिए कुछ कंपाइलर विशिष्ट मानों के लिए प्रारंभ की जाती है। रिलीज में मेमोरी शुरू नहीं होती है जब तक कि एप्लिकेशन कोड द्वारा स्पष्ट रूप से ऐसा नहीं किया जाता है।

अधिक जानकारी के लिए अपने संकलक प्रलेखन की जाँच करें:
लेकिन DevStudio के लिए एक उदाहरण है:

  • 0xCDCDCDCD ढेर में आवंटित है, लेकिन प्रारंभ
  • 0xDDDDDDDD जारी ढेर स्मृति नहीं।
  • 0xFDFDFDFD "NoMansLand" बाड़ स्वचालित रूप से ढेर स्मृति की सीमा पर रखा गया। कभी ओवरराइट नहीं किया जाना चाहिए। यदि आप एक को ओवरराइट करते हैं, तो आप शायद किसी सरणी के अंत से बाहर निकल रहे हैं।
  • 0xCCCCCCCC ढेर पर आवंटित है, लेकिन
3

कुछ ऑपरेटिंग सिस्टम प्रारंभ नहीं किया गया है (जैसे z/OS) एक "पक्ष फ़ाइल" कि डिबग प्रतीक शामिल होते हैं पैदा करते हैं। यह निष्पादन योग्य को अतिरिक्त जानकारी के साथ फलने से बचने में मदद करता है।

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