gdb

2011-03-09 14 views
26
GNU gdb Fedora (6.8-37.el5) 
Kernal 2.6.18-164.el5 

का उपयोग करते समय कोई डिबगिंग प्रतीक नहीं मिला है, मैं अपने आवेदन को डीबग करने का प्रयास कर रहा हूं। हालांकि, हर मैं gdb को बाइनरी पारित यह कहते हैं:gdb

(no debugging symbols found) 

यहाँ द्विआधारी की फ़ाइल उत्पादन है, और जैसा कि आप देख सकते हैं कि यह छीन नहीं है:

vid: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped 

मैं के साथ संकलन कर रहा हूँ निम्नलिखित CFLAGS:

CFLAGS = -Wall -Wextra -ggdb -O0 -Wunreachable-code 

क्या कोई मुझे बता सकता है कि मुझे यहां कुछ सरल याद आ रही है?

अग्रिम में बहुत धन्यवाद,

उत्तर

13

कुछ लिनक्स वितरण gdb शैली डिबगिंग प्रतीकों का उपयोग नहीं करते। (IIRC वे dwarf2 पसंद करते हैं।)

सामान्य तौर पर, gcc और gdb सिंक में रहेंगे करने के लिए के रूप में डिबगिंग प्रतीकों में से किस तरह वे उपयोग करते हैं, और एक विशेष शैली के लिए मजबूर कर सिर्फ समस्याओं का कारण होगा; जब तक आप नहीं जानते कि आपको कुछ और चाहिए, तो बस -g का उपयोग करें।

+2

हैलो, मुझे गलती हुई है कि मैं g ++ के साथ संकलित कर रहा था। हालांकि, मैं डी-डीबग विकल्प में बदल गया है। हालांकि, यह अभी भी प्रतीकों को लोड करने में विफल रहता है। धन्यवाद। – ant2009

+0

क्या आपके प्रोग्राम पर 'एनएम-ए-सी' डीबग प्रतीकों को दिखाता है? 'Objdump -g -C' के बारे में कैसे? बाद में '-g' के साथ -G' या '-W' को बदलने का प्रयास करें। – geekosaur

+2

कोई "जीडीबी शैली" डीबगिंग प्रतीक नहीं है।जीडीबी मंच-मानक डीबग प्रारूप का उपयोग करता है, जो कि लिनक्स पर बौना है {2,3,4}। –

24

आवेदन को संकलित और -g विकल्प से जोड़ा जाना चाहिए। अर्थात। आपको सीपीपीएफएलजीएस और एलडीएफएलजीएस दोनों में -g डालना होगा।

+3

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

+0

@ नियोजित रुशियन आप सही हैं। हालांकि, मैं किसी भी अच्छे कारण के लिए गैर-पोर्टेबल शॉर्टकट करने से बचने का सुझाव देता हूं। दस्तावेज व्यवहार बनाए रखा जाता है, अनियंत्रित - यह एक जोखिम है जिसे आप लेते हैं। और मुझे जोखिम के लिए कोई इनाम नहीं दिख रहा है। लिंकर झंडे में '-g' जोड़ना आपको 0 के करीब होना चाहिए, फिर भी यह आपको एक दिन बचा सकता है। –

+0

कभी अनुमान लगाया नहीं होगा कि इसे एलडीएफएलजीएस में होना जरूरी है! – MrPickles

37

जब -g मौजूद है "कोई डिबगिंग प्रतीकों" का सबसे कारण अक्सर कुछ "आवारा" -s या -S कहीं लिंक लाइन पर तर्क है कि वहाँ है।

man ld से:

-s 
    --strip-all 
     Omit all symbol information from the output file. 

    -S 
    --strip-debug 
     Omit debugger symbol information (but not all symbols) from the output file. 
+1

धन्यवाद, यह मुझे लुआ को डिबग करने में मदद करता है! हालांकि मैंने मेकफ़ाइल में -g विकल्प डाला है, फिर भी एक विकल्प है, जो जीडीबी को प्रतीक नहीं ढूंढ पाता है। –

+0

जब -जी मौजूद है तो "कोई डिबगिंग सिम्बोल्स नहीं मिला" का एक और लगातार कारण CFLAGS को CFLAGES के रूप में गलत तरीके से गलत तरीके से गलत कर रहा है। कम से कम आज मेरे लिए यह आम था। – labyrinth

3

जी के साथ -ggdb बदलें और आप पट्टी कमांड के साथ बाइनरी अलग करना नहीं कर रहे हैं सुनिश्चित करें।

4

यदि आप एंड्रॉइड के लिए संकलित कर रहे हैं तो आपको -gd के बजाय -ggdb भी कोशिश करनी चाहिए!

+0

यह मेरे रास्पबेरी पी 3 (दौड़ने वाले रास्पियन) के लिए भी चाल चल रहा था। – thomthom

2

मुझे पता है कि यह बहुत समय पहले उत्तर दिया गया था, लेकिन मैंने हाल ही में इसी तरह की समस्या को हल करने की कोशिश कर रहे घंटे बिताए हैं। यह सेटअप स्थानीय पीसी है जो एक्लिप्स सीडीटी नियॉन 2 का उपयोग कर डेबियन 8 चला रहा है, रिमोट एआरएम 7 बोर्ड (ओलिमेक्स) डेबियन 7 चला रहा है। टूल चेन रिमोट बोर्ड पर जीडीएसएवरवर और स्थानीय पीसी पर लिनारो जीडीबी का उपयोग कर लिनारो 4.9 है। मेरा मुद्दा यह था कि डीबग सत्र शुरू होगा और कार्यक्रम निष्पादित होगा, लेकिन ब्रेकपॉइंट्स काम नहीं करते थे और जब मैन्युअल रूप से रोका गया "कोई स्रोत नहीं मिला" परिणामस्वरूप होगा। मेरे संकलन लाइन विकल्प (लिनारो जीसीसी) में शामिल हैं-ggdb -O0 जैसा कि कई ने सुझाव दिया है लेकिन अभी भी वही समस्या है। आखिरकार मैंने रिमोट बोर्ड पर जीडीबी उचित कोशिश की और यह कोई प्रतीक की शिकायत नहीं की। उत्सुक बात यह थी कि 'फाइल' की रिपोर्ट डीबग को निष्पादन योग्य लक्ष्य पर नहीं छोड़ी गई थी।

मैंने लिंकर विकल्पों में -g जोड़कर समस्या को हल किया। मैं पूरी तरह से समझने का दावा नहीं करूंगा कि इससे क्यों मदद मिली, लेकिन मैं इसे दूसरों के लिए पास करने में मदद करता था। इस मामले में लिनक्स को वास्तव में लिंकर विकल्पों पर आवश्यकता थी।

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