কোনও লাইব্রেরি -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) ম্যানপেজ দেখুন।
przemoc

3
যে কোনও বাইনারিগুলির জন্য, (-g-এর সাথে সংকলিতগুলি সহ) অ্যাজডাম্প আমাকে -gstabs দিয়ে সংকলন না করে "" কোনও স্বীকৃত ডিবাগিং তথ্য "এর প্রতিক্রিয়া দেয়। এটি একটি স্বীকৃত বাগ হিসাবে উপস্থিত বলে মনে হচ্ছে।
ড্যান হুক

ড্যান, কোন প্ল্যাটফর্মে আপনি এটি চেষ্টা করেছেন?
সুইগি 4'10

নিযুক্ত রাশিয়ান: ম্যান অ্যাজডাম্প (1) থেকে, --debugging পতাকা "ফাইলটিতে সঞ্চিত স্ট্যাবস এবং আইইইই ডিবাগিং ফর্ম্যাট তথ্য পার্স করার চেষ্টা করে এবং সিনট্যাক্সের মতো সি ব্যবহার করে মুদ্রণ করে these যদি এই বিন্যাসগুলির কোনওটি পাওয়া না যায় তবে এই বিকল্পটি পিছনে পড়েছে ফাইলে যে কোনও ডিআরএফ তথ্য প্রিন্ট করতে -W অপশনে। "
ম্যাট ম্যাকক্লেলান

5
objdump -gসরল পরীক্ষার জন্য আমাকে কিছুই দেয় না g। কার্যকরভাবে অকেজো করে তোলে এবং এর সাথে এবং বাইরে উভয়ই সংকলিত করে । উবুন্টু 12.04, জিসিসি 4.6.3, জিএনইউ অ্যাজডাম্প 2.22। nm -aআরো দরকারী বলে মনে হচ্ছে।
jw013

89

প্রস্তাবিত আদেশ

objdump --debugging libinspected.a
objdump --debugging libinspected.so

কমপক্ষে উবুন্টু / লিনারো ৪.৪.২ তে আমাকে সর্বদা একই ফলাফল দেয়:

libinspected.a:     file format elf64-x86-64
libinspected.so:     file format elf64-x86-64

সংরক্ষণাগারটি / ভাগ করা লাইব্রেরি কোনও -gবিকল্পের সাথে বা ছাড়াই নির্মিত হয়েছিল তা বিবেচনা করে নয়

সত্যই কী -gব্যবহৃত হয়েছিল তা নির্ধারণ করতে আমাকে কী সাহায্য করেছিল তা পাঠ্য সরঞ্জাম:

readelf --debug-dump=decodedline libinspected.so

অথবা

readelf --debug-dump=line libinspected.so

এটি উত্স ফাইলের নাম, লাইন নম্বর এবং ঠিকানা সমন্বিত লাইনগুলির সেট প্রিন্ট করবে যদি এই ধরনের ডিবাগ তথ্য লাইব্রেরিতে অন্তর্ভুক্ত করা হয় , অন্যথায় এটি কিছুই মুদ্রণ করবে না

--debug-dumpবিকল্পের পরিবর্তে আপনার প্রয়োজনীয় যে মানটি প্রয়োজন তা আপনি পাস করতে পারেন decodedline


1
পুরোপুরি কাজ করে। আমি প্রথম CMAKE_BUILD_TYPE রিলিজ দিয়ে আমার এক্সিকিউটেবলের উপর এই কমান্ডটি চেষ্টা করেছি এবং কমান্ডটি খালি ফিরে এসেছে। তারপরে আমি 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.

পূর্বের কোনও উত্তরই আমার জন্য অর্থপূর্ণ ফলাফল দিচ্ছিল না: ডিবাগ প্রতীক ছাড়া লিবস প্রচুর আউটপুট প্রদান করছিল, ইত্যাদি etc.


ধন্যবাদ! এটি আমার জন্য কাজ করেছে, কমকে সহ অ্যান্ড্রয়েডে ঝনঝন সংকলক ব্যবহার করে :)
পের নিলস আমসেন

দ্রুত চেকিংয়ের জন্য দুর্দান্ত দুর্দান্ত! * .o অবজেক্ট ফাইলগুলিতেও কাজ করে।
স্টিফেন রোল্যান্ড

28

nm -a <lib> ডিবাগগুলি সহ গ্রন্থাগার থেকে সমস্ত চিহ্ন মুদ্রণ করবে।

সুতরাং আপনি আউটপুটগুলির সাথে তুলনা করতে পারেন nm <lib>এবং nm -a <lib>- যদি সেগুলি পৃথক হয় তবে আপনার লিবে কিছু ডিবাগ চিহ্ন রয়েছে contains


3
@ কর্মরত রাশিয়ান আপনি কি এই সম্পর্কে বিস্তারিত বলতে পারেন? কেন আপনি এটি একটি ভুল সরঞ্জাম মনে করেন? এটি কাজটি করে এবং এটি লিনাক্সেও করে।
qrdl

এমনকি কার্নেল ২.6.৩৫ ভিত্তিতে এম্বেডড লিনাক্সের জন্য, এক্সএক্সএক্সএক্স-অজডাম্প, এক্সএক্সএক্সএক্স-এনএম সূক্ষ্ম কাজ করে।
agfe2

nm -aউপনাম রয়েছে nm --debug-symsযা স্ব-ব্যাখ্যামূলক :-)।
পেভিক

3
সহজেই diff <(nm <lib>) <(nm -a <lib>)
আলাদা

17

ওএসএক্সে আপনি dsymutil -sএবং ব্যবহার করতে পারেনdwarfdump

dsymutil -s <lib_file> | moreআপনি ব্যবহার করে ডিবাগ প্রতীক রয়েছে এমন ফাইলগুলিতে উত্স ফাইল পাথগুলি দেখতে পাবেন তবে অন্যথায় কেবল ফাংশনটির নাম names


11
উদাহরণস্বরূপ, এর আউটপুটটিতে কী সন্ধান করা উচিত তার একটি বিশদ বিবরণ সরবরাহ করতে পারেন dsymutil -s? আউটপুটটির অস্তিত্বের অর্থ কি এটি ডিবাগ প্রতীক নিয়ে নির্মিত হয়েছিল, বা এটি গ্রাপ করা উচিত?
ম্যাচ

12

আপনি এটির জন্য অবজডাম্প ব্যবহার করতে পারেন ।

সম্পাদনা: ম্যান পৃষ্ঠা থেকে:

-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 ম্যানুয়াল।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.