2009-05-15 7 views
138

मुझे पता है कि मैं -g विकल्प का उपयोग कर डीबग प्रतीक उत्पन्न कर सकता हूं। हालांकि प्रतीक लक्ष्य फ़ाइल में एम्बेड किया गया है। परिणाम निष्पादन योग्य/पुस्तकालय के बाहर जीसीसी डीबग प्रतीक उत्पन्न कर सकता है? विंडोज़ वीसी ++ कंपाइलर की .pdb फ़ाइल की तरह।निर्माण लक्ष्य के बाहर जीसीसी डीबग प्रतीक कैसे उत्पन्न करें?

objcopy --only-keep-debug "${tostripfile}" "${debugdir}/${debugfile}" 
strip --strip-debug --strip-unneeded "${tostripfile}" 
objcopy --add-gnu-debuglink="${debugdir}/${debugfile}" "${tostripfile}" 

मैं bash स्क्रिप्ट नीचे का प्रयोग कर एक .debug निर्देशिका में .debug विस्तार के साथ फाइलों में डिबग जानकारी को अलग करने के:

उत्तर

146

आप का उपयोग करने के objcopyseparate the debug information की जरूरत है। इस तरह से मैं एक टैर फ़ाइल में पुस्तकालयों और निष्पादन योग्य और अन्य में .debug निर्देशिकाओं को टैर कर सकता हूं। अगर मैं बाद में डीबग जानकारी जोड़ना चाहता हूं तो मैं बस डीबग टैर फ़ाइल और वॉयला निकालने के लिए प्रतीकात्मक डीबग जानकारी प्राप्त करता हूं।

#!/bin/bash 

scriptdir=`dirname ${0}` 
scriptdir=`(cd ${scriptdir}; pwd)` 
scriptname=`basename ${0}` 

set -e 

function errorexit() 
{ 
    errorcode=${1} 
    shift 
    echo [email protected] 
    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}" 
+6

यदि आपको उत्पादन में कोई समस्या है और प्रक्रिया को जीडीबी के साथ संलग्न करने की आवश्यकता है, तो क्या आप डीडीबी प्रतीक फ़ाइल को जीडीबी को प्रदान करने में सक्षम होंगे? और कैसे, अगर ऐसा है? thnx –

+3

@yves Baumes बस अपने उत्पादन बॉक्स में .debug फ़ाइलों के साथ .debug निर्देशिका जोड़ें और जीडीबी उन्हें उठा लेना चाहिए। डीबग सत्र के बाद आप उन्हें फिर से हटा सकते हैं। – lothar

+0

एक उदाहरण के लिए @ लांस रिचर्डसन उत्तर टिप्पणियों का संदर्भ लें। – GuruM

6

चेक आउट "--only-रख-डिबग" strip आदेश का विकल्प:

यह bash स्क्रिप्ट है।

लिंक से:

मंशा है कि इस विकल्प को एक दो भाग निष्पादन योग्य बनाने के लिए --add-gnu-debuglink साथ संयोजन के रूप में इस्तेमाल किया जाएगा है। एक एक छिद्रित बाइनरी जो रैम में और वितरण में कम जगह पर कब्जा कर लेगी और दूसरी डीबगिंग सूचना फ़ाइल जो केवल डीबगिंग क्षमताओं की आवश्यकता होती है, केवल तभी जरूरी है।

+1

हां, मैंने कोशिश की है: gcc -ggdb -o test test.c; सीपी परीक्षण test.debug; स्ट्रिप - केवल-रख-डीबग test.debug; स्ट्रिप टेस्ट; objcopy --add-gnu-debuglink = test.debug परीक्षण; फिर परीक्षण – zhaorufei

78

डिबग जानकारी के साथ संकलित:

gcc -g -o main main.c 

अलग डिबग जानकारी:

objcopy --only-keep-debug main main.debug 

या

cp main main.debug 
strip --only-keep-debug main.debug 

मूल फ़ाइल से पट्टी डिबग जानकारी:

objcopy --add-gnu-debuglink main.debug main 
gdb main 

तुम भी separatly कार्यकारी फ़ाइल और प्रतीक फ़ाइल का उपयोग कर सकते हैं:

objcopy --strip-debug main 

या

strip --strip-debug --strip-unneeded main 

debuglink मोड द्वारा डिबग :

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

+2

परीक्षण डीबग करना ठीक है और आपको बनाई गई डीबग फ़ाइल और चेकसम के नाम को एम्बेड करने के लिए '' 'objcopy --add-gnu-debuglink मुख्य main.debug''' का उपयोग करना चाहिए। इस मामले में जीडीबी डीबग कोड को कुछ डिस्ट्रीब्यूशन डिप्लेन्ड स्थानों में खुद को खोजने का प्रयास करेगा, अब-विकल्प की आवश्यकता नहीं है। – Lothar

6

नोट: कार्यक्रम उच्च अनुकूलन स्तर के साथ संकलित एस (-ओ 3, -ओ 4) ऑप्टिमाइज्ड चर, इन-लाइन वाले फ़ंक्शंस और अनियंत्रित लूप के लिए कई डिबगिंग प्रतीकों को उत्पन्न नहीं कर सकता है, चाहे किसी भी .ddeug फ़ाइल में एम्बेड किए गए प्रतीकों (-g) या निकाले गए (objcopy) के बावजूद।

वैकल्पिक दृष्टिकोण
ए) कंपाइलर अनुकूलित निष्पादन योग्य (-O3, -O4) के लिए प्रोग्राम में संस्करण (VCS, git, svn) डेटा एम्बेड करें।
बी) निष्पादन योग्य का दूसरा गैर-अनुकूलित संस्करण बनाएं।

पहला विकल्प बाद के दिनांक में पूर्ण डीबगिंग और प्रतीकों के साथ उत्पादन कोड को पुनर्निर्माण करने का माध्यम प्रदान करता है। कोई अनुकूलन के साथ मूल उत्पादन कोड को फिर से बनाने में सक्षम होने के कारण डीबगिंग के लिए जबरदस्त मदद है। (नोट: यह मानता है कि प्रोग्राम के अनुकूलित संस्करण के साथ परीक्षण किया गया था)।

आपकी बिल्ड सिस्टम संकलन दिनांक, प्रतिबद्धता और अन्य वीसीएस विवरणों के साथ लोड की गई .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)\";" > "[email protected]" 
    @echo "const char *build2=\"VCS: Date: $(shell git log -1 --pretty=%cd)\";" >> "[email protected]" 
    @echo "const char *build3=\"VCS: Author: $(shell git log -1 --pretty="%an %ae")\";" >> "[email protected]" 
    @echo "const char *build4=\"VCS: Branch: $(shell git symbolic-ref HEAD)\";" >> "[email protected]" 
    # 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 [email protected] 
VCS: COMMIT_DATE=2013-12-19 

सब छोड़ दिया है यहाँ एक '+ Git बनाने' उदाहरण है मूल कोड को चेक-आउट करना, ऑप्टिमाइज़ेशन के बिना फिर से संकलित करना और डीबगिंग शुरू करना है।

+2

'-O4' भी मौजूद नहीं है। –

+3

ओह, यह 'सनक' दिनों से हो सकता है, जहां '-ओ 5' भी एक विकल्प था। यहां gcc4.4.7 -O विकल्पों का एक लिंक दिया गया है: https://gcc.gnu.org/onlinedocs/gcc-4.4.7/gcc/Optimize-Options.html#Optimize- विकल्प –

+1

यह सामान्य समस्या का समाधान नहीं करता है एक कोर डंप की व्याख्या करने की कोशिश कर रहा है जिसे आसानी से पुन: उत्पन्न नहीं किया जा सकता है। इस जवाब में सलाह ध्वनि है, * लेकिन * यह सवाल को संबोधित नहीं करता है। –

संबंधित मुद्दे