अगर कोई पुस्तकालय -g के साथ संकलित था तो मैं कैसे बता सकता हूं?


103

मेरे पास x86 लिनक्स पर कुछ संकलित पुस्तकालय हैं और मैं जल्दी से यह निर्धारित करना चाहता हूं कि क्या वे डिबगिंग प्रतीकों के साथ संकलित किए गए थे।

जवाबों:


85

यदि आप लिनक्स पर चल रहे हैं, तो उपयोग करें objdump --debugging। लाइब्रेरी में प्रत्येक ऑब्जेक्ट फ़ाइल के लिए एक प्रविष्टि होनी चाहिए। प्रतीकों को डिबग किए बिना ऑब्जेक्ट फ़ाइलों के लिए, आपको कुछ इस तरह दिखाई देगा:

objdump --debugging libvoidincr.a
In archive libvoidincr.a:

voidincr.o:     file format elf64-x86-64

यदि डिबगिंग प्रतीक हैं, तो आउटपुट बहुत अधिक होगा।


5
obdjump -W libऔर भी हैं readelf -w lib। बाद वाला अधिक कॉन्फ़िगर करने योग्य है - रीडफ़्ल (1) मैनपेज देखें।
प्रिन्जोक

3
किसी भी बाइनरी के लिए, (-g के साथ संकलित सहित) objdump मुझे "कोई मान्यता प्राप्त डिबगिंग जानकारी" की प्रतिक्रिया नहीं देता है जब तक कि मैं इसे -ststabs के साथ संकलित नहीं करता। यह एक मान्यता प्राप्त बग प्रतीत होता है।
डैन हुक

दान, आपने यह किस मंच पर आजमाया?
सूगी

कार्यरत रूसी: आदमी objdump (1) से, -debugging ध्वज "फ़ाइल में संग्रहीत STABS और IEEE डिबगिंग प्रारूप को पार्स करने का प्रयास करता है और इसे सिंटैक्स की तरह सी का उपयोग करके प्रिंट करता है। यदि इनमें से कोई भी प्रारूप नहीं मिला है तो यह विकल्प वापस गिर जाता है। -W विकल्प में फ़ाइल में किसी भी DWARF जानकारी को प्रिंट करने के लिए। "
मैट मैकलेलन

5
objdump -gमुझे एक साधारण परीक्षण के लिए कुछ भी नहीं देता है। मैंने दोनों को बिना और बिना संकलित किया g, जिससे यह प्रभावी रूप से बेकार हो गया। Ubuntu 12.04, gcc 4.6.3, GNU objdump 2.22। nm -aअधिक उपयोगी प्रतीत होता है।
jw013

89

सुझाया गया आदेश

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


1
अच्छी तरह से काम। मैंने पहले CMAKE_BUILD_TYPE RELEASE के साथ अपने निष्पादन योग्य पर इस कमांड को आज़माया और कमांड खाली लौट आया। फिर मैंने CMAKE_BUILD_TYPE DEBUG के साथ कोशिश की और तब काफी आउटपुट थे।
infoclogged

32

क्या मदद की है:

gdb mylib.so

यह तब प्रदर्शित होता है जब डिबग प्रतीक नहीं मिलते हैं:

Reading symbols from mylib.so...(no debugging symbols found)...done.

या जब मिला:

Reading symbols from mylib.so...done.

पहले के कोई भी उत्तर मेरे लिए सार्थक परिणाम नहीं दे रहे थे: डिबग प्रतीकों के बिना लिबास बहुत सारे आउटपुट दे रहे थे, आदि।


धन्यवाद! यह मेरे लिए काम किया, cmake के साथ एंड्रॉइड में क्लैंग कंपाइलर का उपयोग करते हुए :)
Pär Nils Amsen

एक तेजी से जाँच के लिए महान! * .o ऑब्जेक्ट फ़ाइलों पर भी काम करता है।
स्टीफन रोलैंड

28

nm -a <lib> लाइब्रेरी से सभी प्रतीकों को प्रिंट करेंगे, जिसमें डिबग वाले भी शामिल हैं।

तो आप के आउटपुट की तुलना कर सकते हैं nm <lib>और nm -a <lib>- यदि वे अलग-अलग हैं, तो आपके काम में कुछ डिबग प्रतीक शामिल हैं।


3
@ नियुक्त रूसी क्या आप इस बारे में विस्तार से बता सकते हैं? आपको क्यों लगता है कि यह एक गलत उपकरण है? यह काम करता है, और यह लिनक्स पर भी करता है।
8

यहां तक ​​कि कर्नेल 2.6.35 पर आधारित एंबेडेड लाइनक्स के लिए, xxx-objdump, xxx-nm ठीक काम करता है।
agfe2

nm -aउर्फ है nm --debug-symsजो स्व-व्याख्यात्मक :-) है।
pevik

3
बस diff <(nm <lib>) <(nm -a <lib>)एक आसान अंतर पाने के लिए टाइप करें
Aᴄʜᴇʀᴏɴғᴀɪʟ

17

OSX पर आप उपयोग कर सकते हैं dsymutil -sऔर dwarfdump

उपयोग करने से dsymutil -s <lib_file> | moreआपको फ़ाइलों में स्रोत फ़ाइल पथ दिखाई देंगे, जिनमें डीबग प्रतीक हैं, लेकिन केवल फ़ंक्शन नाम अन्यथा।


11
क्या आप उदाहरण के लिए, के आउटपुट में क्या देख सकते हैं, के बारे में विस्तार प्रदान कर सकते हैं dsymutil -s? क्या आउटपुट के अस्तित्व का मतलब यह है कि यह डिबग प्रतीकों के साथ बनाया गया था, या इसे पकड़ लिया जाना चाहिए?
मिच

12

आप इसके लिए objdump का उपयोग कर सकते हैं ।

संपादित करें: मैन-पेज से:

-W
--dwarf
Displays  the  contents of the DWARF debug sections in the file, if
any are present.

6

उत्तर के उपयोग का सुझाव देने 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 के मैनुअल में।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.