2010-07-28 13 views
8

मेरे पास एक साधारण सी ++ प्रोग्राम है जिसे मैं डीबग करने का प्रयास कर रहा हूं, लेकिन जीडीबी पुस्तकालयों के लिए ऑब्जेक्ट फ़ाइल नहीं ढूंढ सकता (या कोई डीबग जानकारी उपलब्ध नहीं है), और यह मेरे निष्पादन योग्य के लिए डीबग प्रतीकों को खोजने में सक्षम नहीं लगता है।मैकपॉर्ट्स जीसीसी 4.5 में सी ++ 0x प्रोग्राम कैसे डिबग करूं?

मैं macports साथ, पर OSX 10.5.8 हूँ, और मैं साथ

जी ++ मेरी कोड संकलन - mp-4.5 -Wall -pedantic -std = C++ 0x जी -ggdb मैं/चुनते/स्थानीय/शामिल एल/opt/स्थानीय/lib -lgsl स्थैतिक-libstdC++ एमसीएमसी-simplex.cpp -ओ एमसीएमसी

(वहाँ केवल एक फ़ाइल है, और जी ++ - mp-4.5 macports है जीसीसी/जी ++ 4.5 के लिए निष्पादन योग्य)

जब मैं परिणामस्वरूप निष्पादन योग्य पर gdb चलाने का प्रयास करता हूं, तो मुझे कई त्रुटि संदेश मिलते हैं प्रपत्र

चेतावनी के स्टार्टअप): वस्तु फ़ाइल "/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_lang_gcc45/work/build/i386-apple-darwin9/libgcc/trunctfdf2_s नहीं मिल सका। ओ "- कोई डीबग जानकारी" ../../../gcc-4.5.0/libgcc/../gcc/config/soft-fp/trunctfdf2.c "के लिए उपलब्ध नहीं है।

जो मुझे इंगित करता है कि मैकपोर्ट के निर्माण के दौरान एक बग है (ऐसा लगता है जैसे जीडीबी अस्थायी निर्माण निर्देशिका में ऑब्जेक्ट फ़ाइलों की तलाश में है)।

मैं जोड़ने चाहिए कि जब मैं अपने कार्यक्रमों (एप्पल द्वारा प्रदान की एक) gdb में लिस्टिंग देखने की कोशिश, यह /var/tmp में एक यादृच्छिक .s फ़ाइल देखने के लिए जो मेरे लिए एक कोडांतरक फ़ाइल की तरह लगता है की कोशिश करता है। यही कारण है कि मैं कहता हूं कि यह मेरे प्रोग्राम के लिए डीबग प्रतीकों को खोजने में सक्षम नहीं लगता है।

जब मैं MacPorts GDB 7.1 की कोशिश, मैं

चेतावनी: `/var/folders/Xa/XaqHO9PeEC8K-Nrd0L9xWk+++TM/-Tmp-//cc2IvFto.o ': नहीं कर सकते प्रतीकों को पढ़ने के लिए खुला: ऐसी कोई फ़ाइल या निर्देशिका नहीं। (कोई डिबगिंग प्रतीक नहीं मिला) ... किया गया।

और ऐप्पल के जीडीबी द्वारा दिए गए कई त्रुटि संदेशों में से कोई भी नहीं (हालांकि अंतिम परिणाम समान है)।

क्या कोई इस समस्या को पूरा कर चुका है, और समाधान के साथ आया है?

उत्तर

5

ठीक है, एक और "चाल" एक ही संकलन और लिंक कदम के साथ जा रहा अपने जी ++ कमांड लाइन के लिए
-save-temps=obj
जोड़ने के लिए किया जाएगा रखने के लिए इतना है कि

4 निकालें/tmp/[ यादृच्छिक स्ट्रिंग] ओ और एस

वास्तव में प्रदर्शन किया तरह की नहीं है (वास्तव में आप निर्देशिका में विहित SOURCE.o और SOURCE.s फ़ाइलों जहां यादृच्छिक-STRING के बजाय का निर्माण कर रहे होने अंत [ओएस] कुछ अस्थायी फ़ोल्डरों में, लेकिन बिंदु से डीबगिंग प्रतीकों का पता लगाने के बारे में जो

+0

बहुत बुरा मैं कई प्रश्नों को "सर्वश्रेष्ठ" के रूप में नहीं बना सकता। हालांकि जानकारी के लिए धन्यवाद! –

+0

धन्यवाद! यह एक फोर्टन कार्यक्रम डीबग करने के लिए जीडीबी का उपयोग करने की कोशिश करते समय मदद मिली। Gfortran 4.4 के लिए, ऐसा लगता है कि यह ध्वज के '[= dir]' भाग को नहीं पहचानता है, इसलिए आपको केवल '-वेव-टेम्पस' का उपयोग करना होगा। –

11

अन्य यूनिक्स के विपरीत, मैकोज़ पर डीबग जानकारी निष्पादन योग्य में संलग्न नहीं है। इसके बजाए, निष्पादन योग्य ऑब्जेक्ट फ़ाइलों की एक सूची है जो इसमें जुड़ी हुई थीं, और डीबगर इन व्यक्तिगत ऑब्जेक्ट फ़ाइलों में डीबग जानकारी ढूंढता है।

यदि आप ऑब्जेक्ट फ़ाइलों को हटाते हैं, तो आप डीबग नहीं कर सकते हैं।

  1. विधानसभा फ़ाइल बनाएँ /tmp/[random-string].s
  2. में /tmp/[random-string].o
  3. लिंक /tmp/[random-string].o यह इकट्ठा साथ crt0.o, libc, आदि:

    जब आप संकलन और "एकल कदम" में निष्पादन योग्य लिंक, जीसीसी करता है mcmc निष्पादन योग्य में।

  4. निकालें /tmp/[random-string].o और .s

ऐसा नहीं है कि अंतिम चरण जो आप डिबगिंग से रोकता है।

समाधान:

g++-mp-4.5 -Wall -pedantic -std=c++0x -g -ggdb -c MCMC-simplex.cpp 
g++-mp-4.5 MCMC-simplex.o -lgsl -static-libstdc++ -o mcmc 

यह मौजूदा निर्देशिका में MCMC-simplex.o छोड़ देंगे, और GDB उस में डिबग जानकारी को खोजने के लिए अनुमति देगा।

+0

धन्यवाद! यह मुझे मेरे कोड को डीबग करने में सक्षम बनाता है, लेकिन मुझे अभी भी चेतावनी की त्रुटि मिलती है: '/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_lang_gcc45/work/build/i386-apple-darwin9/libgcc/ _powixf2_s.o ': प्रतीकों को पढ़ने के लिए नहीं खोल सकता: ऐसी कोई फ़ाइल या निर्देशिका नहीं। जो मुझे लगता है कि मुझे मैकपॉर्ट्स पर दोष देना चाहिए। –

+0

यह वही मुद्दा है जैसा रूसी ने कहा था कि जीसीसी पुस्तकालय के लिए .o फ़ाइल नहीं है। क्या आप जीसीसी libs में प्रवेश करना चाहते हैं? आप मैकपोर्ट्स को कंपाइलर ऑब्जेक्ट्स को छोड़ने के लिए कह सकते हैं। macports.conf विकल्प portautoclean – Mark

+0

@Mark देखें, कौन सा विकल्प macports.conf के साथ '.o' फ़ाइलों को रखता है? – highBandWidth

2

ऐसा लगता है कि आपको दो समस्याएं थीं: 1) निष्पादन योग्य के लिए कोई डीबग प्रतीक नहीं है और 2) चेतावनी उत्पन्न करने वाले कुछ साझा पुस्तकालयों के लिए कोई डीबग प्रतीक नहीं है। मुझे समस्या भी थी 2)। नियोजित रूसी ने उत्तर दिया 1) और मुझे सही दिशा में 2 के लिए इंगित किया)।

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

आप स्ट्रिंग कमांड के साथ इसे सत्यापित कर सकते हैं। आप gettings चेतावनी /crazy/path/to/something.o कि जब libsomething.dylib लोड नहीं पाया जा सकता है कर रहे हैं:

strings - libsomething.dylib | grep something.o 

ध्यान दें कि आप की जरूरत '-' (यह मेरे लिए पहली बार मिला)।

यह इतना तरह ठीक करने के लिए, पट्टी डिबगिंग जानकारी:

strip -S libsomething.dylib 

बाद में, 'dwarfdump --file-आँकड़े libsomething.dylib' दिखाना चाहिए कि "डिबग stabs" अनुभाग खाली है। (ऑब्जेक्ट फ़ाइलों के लिंक STABS डीबग प्रारूप में संग्रहीत हैं।)

कोई और बदसूरत चेतावनी .. हाँ!

वह रास्ता बहुत कठिन था।

+0

मुझे यह समस्या थी, और स्ट्रिप-एस ने हमारे द्वारा बनाए गए कुछ डाइलिब के लिए किया था, लेकिन मुझे /Library/Frameworks/Blah.framework/Versions/Current/Blah में कुछ स्थापित ढांचे को भी पट्टी करना पड़ा। –

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