উত্তর:
ডিবাগের তথ্য আলাদা করতে আপনাকে অবজকপি ব্যবহার করতে হবে :
objcopy --only-keep-debug "${tostripfile}" "${debugdir}/${debugfile}"
strip --strip-debug --strip-unneeded "${tostripfile}"
objcopy --add-gnu-debuglink="${debugdir}/${debugfile}" "${tostripfile}"
আমি .debug ডিরেক্টরিতে একটি .debug এক্সটেনশন দিয়ে ডিবাগ তথ্য ফাইলে পৃথক করতে নীচের ব্যাশ স্ক্রিপ্টটি ব্যবহার করি। এইভাবে আমি লাইব্রেরিগুলি এবং এক্সিকিউটেবলগুলিকে একটি টার ফাইল এবং অন্যটিতে .debug ডিরেক্টরিগুলিতে ট্যার করতে পারি। আমি পরে ডিবাগ তথ্য যুক্ত করতে চাইলে আমি কেবলমাত্র ডিবাগ টার ফাইলটি বের করি এবং ভয়েলা আমার কাছে প্রতীকী ডিবাগ তথ্য রয়েছে।
এটি বাশ লিপি:
#!/bin/bash
scriptdir=`dirname ${0}`
scriptdir=`(cd ${scriptdir}; pwd)`
scriptname=`basename ${0}`
set -e
function errorexit()
{
errorcode=${1}
shift
echo $@
exit ${errorcode}
}
function usage()
{
echo "USAGE ${scriptname} <tostrip>"
}
tostripdir=`dirname "$1"`
tostripfile=`basename "$1"`
if [ -z ${tostripfile} ] ; then
usage
errorexit 0 "tostrip must be specified"
fi
cd "${tostripdir}"
debugdir=.debug
debugfile="${tostripfile}.debug"
if [ ! -d "${debugdir}" ] ; then
echo "creating dir ${tostripdir}/${debugdir}"
mkdir -p "${debugdir}"
fi
echo "stripping ${tostripfile}, putting debug info into ${debugfile}"
objcopy --only-keep-debug "${tostripfile}" "${debugdir}/${debugfile}"
strip --strip-debug --strip-unneeded "${tostripfile}"
objcopy --add-gnu-debuglink="${debugdir}/${debugfile}" "${tostripfile}"
chmod -x "${debugdir}/${debugfile}"
--build-id
লিংকার বিকল্পটি নিয়ে আপনি কি কোনও সমস্যা পেয়েছেন ?
ডিবাগ তথ্য সহ সংকলন:
gcc -g -o main main.c
ডিবাগ তথ্য পৃথক করুন:
objcopy --only-keep-debug main main.debug
অথবা
cp main main.debug
strip --only-keep-debug main.debug
উত্স ফাইল থেকে স্ট্রিপ ডিবাগ তথ্য:
objcopy --strip-debug main
অথবা
strip --strip-debug --strip-unneeded main
ডিবাগলিঙ্ক মোড দ্বারা ডিবাগ:
objcopy --add-gnu-debuglink main.debug main
gdb main
আপনি এক্সিকিউটি ফাইল এবং সিম্বল ফাইল পৃথকভাবে ব্যবহার করতে পারেন:
gdb -s main.debug -e main
অথবা
gdb
(gdb) exec-file main
(gdb) symbol-file main.debug
বিস্তারিত জানার জন্য:
(gdb) help exec-file
(gdb) help symbol-file
সূত্র:
https://sourceware.org/gdb/onlinedocs/gdb/Files.html#Files
https://sourceware.org/gdb/onlinedocs/gdb/Separate-Debug-Files.html
objcopy --add-gnu-debuglink main main.debug
তৈরি করা ডিবাগ ফাইলের নাম এবং একটি চেকসাম এম্বেড করতে ব্যবহার করা উচিত । এক্ষেত্রে জিডিবি কয়েকটি বিতরণ নির্ভর স্থানগুলিতে ডিবাগ কোড নিজেই সন্ধান করার চেষ্টা করবে, নো-এস বিকল্পের আর প্রয়োজন নেই।
স্ট্রিপ কমান্ডের "--only-keep-debug" বিকল্পটি দেখুন ।
লিঙ্ক থেকে:
উদ্দেশ্যটি হ'ল এই বিকল্পটি --add-gnu-debuglink এর সাথে দুটি অংশ এক্সিকিউটেবল তৈরির জন্য ব্যবহার করা হবে। একটি স্ট্রিপড বাইনারি যা র্যাম এবং বিতরণে কম স্থান দখল করবে এবং দ্বিতীয়টি একটি ডিবাগিং তথ্য ফাইল যা কেবলমাত্র ডিবাগিং সক্ষমতার প্রয়োজন হলে প্রয়োজনীয়।
দ্রষ্টব্য: উচ্চ-অপ্টিমাইজেশন স্তর (-O3, -O4) দিয়ে সংকলিত প্রোগ্রামগুলি অনুকূলিত ভেরিয়েবল, ইন-লাইনেড ফাংশন এবং আন-রেড লুপগুলির জন্য অনেকগুলি ডিবাগিং প্রতীক তৈরি করতে পারে না, প্রতীকগুলি এম্বেড (-জি) বা এক্সট্রাক্ট করা (অ্যাজকপি) কোনও ক্ষেত্রেই নির্বিশেষে '.debug' ফাইল।
বিকল্প পদ্ধতির হয়
প্রথম বিকল্পটি পরে ডিবেগিং এবং প্রতীক সহ প্রডাকশন কোডটি পুনর্নির্মাণের একটি উপায় সরবরাহ করে। কোনও অপ্টিমাইজেশন ছাড়াই মূল উত্পাদন কোডটি পুনরায় তৈরি করতে সক্ষম হওয়া ডিবাগিংয়ের জন্য একটি দুর্দান্ত সহায়তা। (দ্রষ্টব্য: অনুমান করা হয় যে প্রোগ্রামটির অনুকূলিত সংস্করণ দিয়ে পরীক্ষা করা হয়েছিল) testing
আপনার বিল্ড সিস্টেমটি সংকলনের তারিখ, প্রতিশ্রুতিবদ্ধ এবং অন্যান্য ভিসিএস বিবরণ সহ লোড করা একটি .c ফাইল তৈরি করতে পারে। এখানে একটি 'মেক + গিট' উদাহরণ রয়েছে:
program: program.o version.o
program.o: program.cpp program.h
build_version.o: build_version.c
build_version.c:
@echo "const char *build1=\"VCS: Commit: $(shell git log -1 --pretty=%H)\";" > "$@"
@echo "const char *build2=\"VCS: Date: $(shell git log -1 --pretty=%cd)\";" >> "$@"
@echo "const char *build3=\"VCS: Author: $(shell git log -1 --pretty="%an %ae")\";" >> "$@"
@echo "const char *build4=\"VCS: Branch: $(shell git symbolic-ref HEAD)\";" >> "$@"
# TODO: Add compiler options and other build details
.TEMPORARY: build_version.c
প্রোগ্রামটি সংকলিত হওয়ার পরে আপনি কমান্ডটি ব্যবহার করে আপনার কোডের জন্য মূল 'প্রতিশ্রুতি' সনাক্ত করতে পারেন: strings -a my_program | grep VCS
VCS: PROGRAM_NAME=my_program
VCS: Commit=190aa9cace3b12e2b58b692f068d4f5cf22b0145
VCS: BRANCH=refs/heads/PRJ123_feature_desc
VCS: AUTHOR=Joe Developer joe.developer@somewhere.com
VCS: COMMIT_DATE=2013-12-19
যা অবশিষ্ট রয়েছে তা হ'ল মূল কোডটি চেক-আউট করা, অপটিমাইজেশন ছাড়াই পুনরায় সংকলন করা এবং ডিবাগিং শুরু করা।
-O4
এমনকি অস্তিত্ব নেই।