क्या यह जांचना संभव है कि दिए गए प्रोग्राम को GNU ग्रिट इंस्ट्रूमेंटेशन के साथ संकलित किया गया है, यानी '-pg' ध्वज के साथ संकलक और लिंकर दोनों को पारित किया गया है, बिना यह जाँचने के लिए कि क्या यह एक gmon.out
फ़ाइल उत्पन्न करेगा ?
क्या यह जांचना संभव है कि दिए गए प्रोग्राम को GNU ग्रिट इंस्ट्रूमेंटेशन के साथ संकलित किया गया है, यानी '-pg' ध्वज के साथ संकलक और लिंकर दोनों को पारित किया गया है, बिना यह जाँचने के लिए कि क्या यह एक gmon.out
फ़ाइल उत्पन्न करेगा ?
जवाबों:
आप फ़ंक्शन के संदर्भ mcount
(या संभवतः _mcount
या प्रोफाइलिंग के कार्यान्वयन के__mcount
अनुसार ) की जांच कर सकते हैं। यह फ़ंक्शन काम करने के लिए रूपरेखा के लिए आवश्यक है, और गैर-कुशल बायनेरिज़ के लिए अनुपस्थित होना चाहिए।
कुछ इस तरह:
$ readelf -s someprog | egrep "\s(_+)?mcount\b" && echo "Profiling is on for someprog"
ऊपर एक त्वरित परीक्षण पर यहाँ काम करता है।
उत्तरों में अधिक जोड़ना:
इंस्ट्रूमेंटेशन की जांच करने के लिए, mcount / gmon के लिए grep:
$ readelf -s <binary> | egrep "gmon|mcount"
20: 0000000000401160 63 FUNC GLOBAL DEFAULT 12 __gmon_start__
28: 0000000000000000 0 FUNC GLOBAL DEFAULT UND mcount@GLIBC_2.2.5 (2)
36: 0000000000000000 0 FILE LOCAL DEFAULT ABS gmon-start.c
39: 00000000004011a0 0 FUNC LOCAL DEFAULT 12 call_gmon_start
100: 0000000000401160 63 FUNC GLOBAL DEFAULT 12 __gmon_start__
114: 0000000000000000 0 FUNC GLOBAL DEFAULT UND mcount@@GLIBC_2.2.5
किसी को -pg
झंडे के साथ लिंक को संकलित करने की आवश्यकता है , अन्यथा gmon.out
उत्पन्न नहीं किया जाएगा। stackoverflow लिंक।
मैंने पाया कि जिस बाइनरी पर मैं ग्रिट कर रहा था, उसने झंडे के gmon.out
साथ संकलन / लिंक करने के बावजूद कोई फ़ाइल नहीं बनाई -pg
। इसका कारण यह है - मैं अपने आवेदन को मार रहा था, यह एक साफ निकास नहीं था। gprof
जब प्रोग्राम सामान्य रूप से बाहर निकलता है तो केवल आउटपुट उत्पन्न करता है। stackoverflow लिंक