উত্তর:
আপনি যদি লিনাক্সে চলছেন তবে ব্যবহার করুন objdump --debugging
। লাইব্রেরিতে প্রতিটি অবজেক্ট ফাইলের জন্য একটি এন্ট্রি থাকা উচিত। ডিবাগিং প্রতীক ছাড়াই অবজেক্ট ফাইলগুলির জন্য, আপনি এমন কিছু দেখতে পাবেন:
objdump --debugging libvoidincr.a
In archive libvoidincr.a:
voidincr.o: file format elf64-x86-64
যদি ডিবাগিং প্রতীক থাকে তবে আউটপুটটি অনেক বেশি ভার্বোজ হবে।
objdump -g
সরল পরীক্ষার জন্য আমাকে কিছুই দেয় না g
। কার্যকরভাবে অকেজো করে তোলে এবং এর সাথে এবং বাইরে উভয়ই সংকলিত করে । উবুন্টু 12.04, জিসিসি 4.6.3, জিএনইউ অ্যাজডাম্প 2.22। nm -a
আরো দরকারী বলে মনে হচ্ছে।
প্রস্তাবিত আদেশ
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
।
যা সাহায্য করেছে তা হ'ল:
gdb mylib.so
এটি মুদ্রণ করে যখন ডিবাগ প্রতীক পাওয়া যায় না:
Reading symbols from mylib.so...(no debugging symbols found)...done.
বা পাওয়া গেলে:
Reading symbols from mylib.so...done.
পূর্বের কোনও উত্তরই আমার জন্য অর্থপূর্ণ ফলাফল দিচ্ছিল না: ডিবাগ প্রতীক ছাড়া লিবস প্রচুর আউটপুট প্রদান করছিল, ইত্যাদি etc.
nm -a <lib>
ডিবাগগুলি সহ গ্রন্থাগার থেকে সমস্ত চিহ্ন মুদ্রণ করবে।
সুতরাং আপনি আউটপুটগুলির সাথে তুলনা করতে পারেন nm <lib>
এবং nm -a <lib>
- যদি সেগুলি পৃথক হয় তবে আপনার লিবে কিছু ডিবাগ চিহ্ন রয়েছে contains
nm -a
উপনাম রয়েছে nm --debug-syms
যা স্ব-ব্যাখ্যামূলক :-)।
diff <(nm <lib>) <(nm -a <lib>)
ওএসএক্সে আপনি dsymutil -s
এবং ব্যবহার করতে পারেনdwarfdump
।
dsymutil -s <lib_file> | more
আপনি ব্যবহার করে ডিবাগ প্রতীক রয়েছে এমন ফাইলগুলিতে উত্স ফাইল পাথগুলি দেখতে পাবেন তবে অন্যথায় কেবল ফাংশনটির নাম names
dsymutil -s
? আউটপুটটির অস্তিত্বের অর্থ কি এটি ডিবাগ প্রতীক নিয়ে নির্মিত হয়েছিল, বা এটি গ্রাপ করা উচিত?
বাইনারি থেকে পৃথক কোনও ফাইলে ডিবাগের তথ্য সংরক্ষণ করা হয়, বা বাইনারিটিতে একটি ডিবাগ লিঙ্ক বিভাগ রয়েছে এমন ক্ষেত্রে ব্যবহার 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) ম্যানপেজ দেখুন।