2014-11-23 6 views
6

उत्पन्न नहीं करता है मैंने प्रोफाइलिंग ध्वज (-pg) का उपयोग कर जीसीसी के साथ एक कोड संकलित किया है, लेकिन जब मैं प्रोग्राम चलाता हूं तो कोई gmon.out उत्पन्न नहीं होता है।
मैंने परीक्षण कोड संकलित किया - वास्तव में, this प्रश्न से - यह देखने के लिए कि संकलन ध्वज & gprof काम कर रहे थे और, हाँ, यह काम करता था।प्रोफाइलिंग झंडा के साथ संकलित कोड gmon.out

कोड (xrttimetag नाम) निम्न पंक्ति इस्तेमाल किया गया था (यहाँ नीचे मैं -I(...) और -L(...) इस्तेमाल किया अन्य वैज्ञानिक पुस्तकालयों के लिए एक बहुत बड़ा पथों की सूची को छिपाने के लिए) संकलन करने के लिए:

gcc -c -o ./xrttimetag.o -Wall --pedantic -Wno-comment -Wno-long-long -pg -fPIC -I(...) -DPACKAGE_NAME="" -DPACKAGE_TARNAME="" -DPACKAGE_VERSION="" -DPACKAGE_STRING="" -DPACKAGE_BUGREPORT="" -DPACKAGE_URL="" -Dg77Fortran=1 -DgFortran=1 -DHAVE_CONNECT=1 -DHAVE_ACCEPT=1 -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_LIBM=1 -DHAVE_LIBDL=1 -DHAVE_LIBNCURSES=1 -DSIZEOF_LONG=8 xrttimetag.c 

gcc -o xrttimetag xrttimetag.o  -L(...) -lswxrt -latFunctions3.3 -lcoordfits -lcoord -lephemeris -lhdinit_2.7 -lhdutils_2.7 -lape_2.8 -lcfitsio_3.37 -lreadline -lhdio_2.7 -lncurses -ldl -lm -L/usr/lib64/gcc/x86_64-suse-linux/4.6 -L/usr/lib64/gcc/x86_64-suse-linux/4.6/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib64/gcc/x86_64-suse-linux/4.6/../../../../x86_64-suse-linux/lib -L/usr/lib64/gcc/x86_64-suse-linux/4.6/../../.. -L/usr/lib64/gcc/x86_64-suse-linux/4.6 -L/usr/lib64/gcc/x86_64-suse-linux/4.6/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib64/gcc/x86_64-suse-linux/4.6/../../../../x86_64-suse-linux/lib -L/usr/lib64/gcc/x86_64-suse-linux/4.6/../../.. -lgfortran -lm -lgcc_s -lgcc -lquadmath -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc 

मैं संबंधित प्रतीकों के लिए देखा gmon पर करने के लिए द्विआधारी उत्पन्न होते हैं और वे क्योंकि वे अपरिभाषित हैं मेरे लिए थोड़ा अजीब लग रही है:

readelf -s `which xrttimetag` | egrep "gmon|mcount" 
21: 0000000000000000  0 NOTYPE WEAK DEFAULT UND __gmon_start__ 
74: 0000000000000000  0 FUNC GLOBAL DEFAULT UND [email protected]_2.2.5 (2) 
41: 000000000040267c  0 FUNC LOCAL DEFAULT 15 call_gmon_start 
96: 0000000000000000  0 NOTYPE WEAK DEFAULT UND __gmon_start__ 
166: 0000000000000000  0 FUNC GLOBAL DEFAULT UND [email protected]@GLIBC_2.2.5 

OT पर

जी ++ -pg test.cpp

और "gmon | mcount" के लिए खोज प्रतीकों मुझे दे: उसके हाथ, test कोड, मैं के साथ संकलित

readelf -s test | egrep "gmon|mcount" 
6: 0000000000000000  0 FUNC GLOBAL DEFAULT UND [email protected]_2.2.5 (3) 
11: 0000000000400850 63 FUNC GLOBAL DEFAULT 15 __gmon_start__ 
40: 0000000000000000  0 FILE LOCAL DEFAULT ABS gmon-start.c 
43: 0000000000400890  0 FUNC LOCAL DEFAULT 15 call_gmon_start 
73: 0000000000400850 63 FUNC GLOBAL DEFAULT 15 __gmon_start__ 
91: 0000000000000000  0 FUNC GLOBAL DEFAULT UND [email protected]@GLIBC_2.2.5 

हम क्या "gmon" प्रतीकों को _ test_ कोड के लिए अच्छी तरह से परिभाषित किया गया है और _ xrttimetag_ के लिए नहीं, लेकिन मुझे वास्तव में क्यों नहीं समझा जाता है। मैं क्या खो रहा हूँ?

धन्यवाद।

पीएस: मैंने gmon.out is not written after compiling with gcc -pg -g प्रश्न देखा, और यह एक नकल नहीं है, जब तक कि मैंने इसे पूरी तरह गलत समझा नहीं।

+2

मुझे एक ही समस्या थी .. उत्कृष्ट समस्या विवरण और उत्तर! – brokenfoot

उत्तर

12

निष्पादन योग्य उत्पन्न करते समय आप -pg पास नहीं कर रहे हैं।

अर्थात

gcc -o xrttimetag xrttimetag.o .... 

आप -pg विकल्प यहाँ भी पास करना चाहिए। मैं संकलन करते समय -pg का उपयोग करते समय समस्या को पुन: उत्पन्न कर सकता हूं (यानी प्रतीकों को गमन * कॉल के लिए अपरिभाषित किया जाता है)।

gcc documentation से:

-pg

विश्लेषण कार्यक्रम gprof के लिए उपयुक्त प्रोफ़ाइल जानकारी लिखने के लिए अतिरिक्त कोड जनरेट करें। स्रोत फ़ाइलों को संकलित करते समय आपको इस विकल्प का उपयोग करना होगा, जिसके बारे में आप डेटा चाहते हैं, और लिंकिंग के दौरान भी इसका उपयोग करना होगा।

+0

बिल्कुल सही। धन्यवाद! सिर्फ उत्तर देने के लिए: मेरे मामले में, जहां मैं अच्छे पुराने जीएनयू का उपयोग कर रहा हूं, मेकफ़ाइल को संशोधित करना नहीं चाहता था, "-पीजी" ध्वज को (पर्यावरण परिवर्तनीय) CFLAGS के माध्यम से होल्ड प्रक्रिया में जोड़ा गया था (के लिए ऑब्जेक्ट (.o) पीढ़ी) और लिंकिंग चरण के लिए एलडीएफएलजीएस। – Brandt

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