2010-07-19 21 views
50

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

उत्तर

50

आप लिनक्स पर file और objdump का उपयोग कर सकते हैं। विशेष रूप से, आप देख सकते हैं कि फ़ाइल "स्ट्रिप" या "स्ट्रिप नहीं" कहती है, और objdump --syms कुछ भी उपयोगी आउटपुट करता है (मेरे लिए, यह नियमित निर्माण के लिए "कोई प्रतीक नहीं" कहता है)।

+4

स्ट्रिप का मतलब कोई प्रतीक नहीं है, है ना? ओएस एक्स के बराबर –

+17

'otool -Iv' है। –

+5

otool -Iv के आउटपुट में क्या देखना है? –

29

जब objdump --syms आदेश चलाकर, मैं (कम से कम कर्नेल के लिए वस्तुओं) की तुलना में उत्पादन में "कोई प्रतीकों" और अधिक देखते हैं।

यह जांचने के लिए कि कर्नेल ऑब्जेक्ट के अंदर डीबग जानकारी है या नहीं, आप objdump कमांड के अंत में निम्नलिखित जोड़ सकते हैं: | grep debug

यदि यह स्ट्रिंग पाई जाती है, तो आप जानते हैं कि कर्नेल ऑब्जेक्ट में डीबग जानकारी है। यदि नहीं, तो यह एक "साफ" कर्नेल ऑब्जेक्ट है। एक कर्नेल मॉड्यूल के

उदाहरण मैं बिना डिबग जानकारी संकलित किया है:

[email protected]:~/mystuff/kernels/linux-3.12.6$ objdump --syms ./modules/lib/modules/3.12.6/kernel/drivers/i2c/busses/i2c-at91.ko | grep debug 
00000000 l d .debug_frame 00000000 .debug_frame 
00000000 l d .debug_info 00000000 .debug_info 
00000000 l d .debug_abbrev 00000000 .debug_abbrev 
00000000 l d .debug_loc  00000000 .debug_loc 
00000000 l d .debug_aranges 00000000 .debug_aranges 
00000000 l d .debug_ranges 00000000 .debug_ranges 
00000000 l d .debug_line 00000000 .debug_line 
00000000 l d .debug_str  00000000 .debug_str 
00000010 l  .debug_frame 00000000 $d 

के रूप में:

[email protected]:~/mystuff/kernels/linux-3.12.6$ objdump --syms ./modules/lib/modules/3.12.6/kernel/drivers/i2c/busses/i2c-at91.ko | grep debug 

है कि एक ही कर्नेल मॉड्यूल का उदाहरण मैं डिबग जानकारी के साथ संकलित किया है आप देख सकते हैं, पहला आउटपुट कुछ भी नहीं देता है, जबकि दूसरा आउटपुट debug के साथ लाइनों को वापस करता है।

नोट: मेरे मामले में, file कमांड ने मुझे डीबग और गैर-डीबग केस में "छीन लिया नहीं" वापस कर दिया। हालांकि, कर्नेल ऑब्जेक्ट के आकार में अंतर उल्लेखनीय था:

  • लगभग। डीबग जानकारी के बिना 16k
  • लगभग। 137k डीबग जानकारी के साथ

स्पष्ट रूप से, बाद के संस्करण में जानकारी डीबग थी।

मेरा प्रश्न: file कमांड ऐसे मामलों में विश्वसनीय है? जो मैंने अनुभव किया है, उससे मैं objdump --syms ... | grep debug कमांड पर भरोसा करता हूं।

+0

मुझे भी 'फाइल' के साथ एक ही समस्या थी। मेरे लिए, 'grep' बिट के बिना' objdump --syms' गैर-डीबग बिल्ड पर भी कई परिणाम उत्पन्न करता है, लेकिन 'grep' विशिष्ट डीबग-केवल प्रतीकों को कॉल करने में मदद करता है, जो मेरे लिए काम करता है। – patrickvacek

+1

+ 'फ़ाइल' आउटपुट में अस्पष्टता को साफ़ करने के लिए एक – ADJ

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

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