जवाबों:
यदि आप लिनक्स पर चल रहे हैं, तो उपयोग करें objdump --debugging
। लाइब्रेरी में प्रत्येक ऑब्जेक्ट फ़ाइल के लिए एक प्रविष्टि होनी चाहिए। प्रतीकों को डिबग किए बिना ऑब्जेक्ट फ़ाइलों के लिए, आपको कुछ इस तरह दिखाई देगा:
objdump --debugging libvoidincr.a
In archive libvoidincr.a:
voidincr.o: file format elf64-x86-64
यदि डिबगिंग प्रतीक हैं, तो आउटपुट बहुत अधिक होगा।
objdump -g
मुझे एक साधारण परीक्षण के लिए कुछ भी नहीं देता है। मैंने दोनों को बिना और बिना संकलित किया g
, जिससे यह प्रभावी रूप से बेकार हो गया। Ubuntu 12.04, gcc 4.6.3, GNU objdump 2.22। nm -a
अधिक उपयोगी प्रतीत होता है।
सुझाया गया आदेश
objdump --debugging libinspected.a
objdump --debugging libinspected.so
मुझे हमेशा उबुन्टु / लिनारो 4.5.2 पर कम से कम एक ही परिणाम मिलता है:
libinspected.a: file format elf64-x86-64
libinspected.so: file format elf64-x86-64
कोई फर्क नहीं पड़ता कि संग्रह / साझा पुस्तकालय -g
विकल्प के साथ या बिना बनाया गया था
क्या वास्तव में मुझे मदद की निर्धारित करने के लिए -g
इस्तेमाल किया गया था है readelf उपकरण:
readelf --debug-dump=decodedline libinspected.so
या
readelf --debug-dump=line libinspected.so
यह स्रोत फ़ाइल नाम, लाइन नंबर और पते से युक्त रेखाओं के सेट को प्रिंट करेगा यदि ऐसी डीबग जानकारी को लाइब्रेरी में शामिल किया जाता है , अन्यथा यह कुछ भी नहीं प्रिंट करेगा ।
आप --debug-dump
इसके बदले विकल्प के लिए जो भी मूल्य आवश्यक समझेंगे, पारित कर सकते हैं decodedline
।
क्या मदद की है:
gdb mylib.so
यह तब प्रदर्शित होता है जब डिबग प्रतीक नहीं मिलते हैं:
Reading symbols from mylib.so...(no debugging symbols found)...done.
या जब मिला:
Reading symbols from mylib.so...done.
पहले के कोई भी उत्तर मेरे लिए सार्थक परिणाम नहीं दे रहे थे: डिबग प्रतीकों के बिना लिबास बहुत सारे आउटपुट दे रहे थे, आदि।
nm -a <lib>
लाइब्रेरी से सभी प्रतीकों को प्रिंट करेंगे, जिसमें डिबग वाले भी शामिल हैं।
तो आप के आउटपुट की तुलना कर सकते हैं nm <lib>
और nm -a <lib>
- यदि वे अलग-अलग हैं, तो आपके काम में कुछ डिबग प्रतीक शामिल हैं।
nm -a
उर्फ है nm --debug-syms
जो स्व-व्याख्यात्मक :-) है।
diff <(nm <lib>) <(nm -a <lib>)
एक आसान अंतर पाने के लिए टाइप करें
OSX पर आप उपयोग कर सकते हैं dsymutil -s
और dwarfdump
।
उपयोग करने से dsymutil -s <lib_file> | more
आपको फ़ाइलों में स्रोत फ़ाइल पथ दिखाई देंगे, जिनमें डीबग प्रतीक हैं, लेकिन केवल फ़ंक्शन नाम अन्यथा।
dsymutil -s
? क्या आउटपुट के अस्तित्व का मतलब यह है कि यह डिबग प्रतीकों के साथ बनाया गया था, या इसे पकड़ लिया जाना चाहिए?
आप इसके लिए objdump का उपयोग कर सकते हैं ।
संपादित करें: मैन-पेज से:
-W
--dwarf
Displays the contents of the DWARF debug sections in the file, if
any are present.
उत्तर के उपयोग का सुझाव देने objdump --debugging
या readelf --debug-dump=...
काम न करने की स्थिति में, डीबग जानकारी को बाइनरी से अलग फ़ाइल में संग्रहीत किया जाता है, अर्थात बाइनरी में डीबग लिंक अनुभाग होता है। शायद कोई भी उस बग को कॉल कर सकता है readelf
।
निम्नलिखित कोड को इसे सही ढंग से संभालना चाहिए:
# Test whether debug information is available for a given binary
has_debug_info() {
readelf -S "$1" | grep -q " \(.debug_info\)\|\(.gnu_debuglink\) "
}
देखें अलग डिबग फ़ाइलें अधिक जानकारी के लिए GDB के मैनुअल में।
obdjump -W lib
और भी हैंreadelf -w lib
। बाद वाला अधिक कॉन्फ़िगर करने योग्य है - रीडफ़्ल (1) मैनपेज देखें।