पता लगाएं कि क्या एक ईएलएफ बाइनरी को ग्रिफ़ इंस्ट्रूमेंटेशन के साथ बनाया गया था?


11

क्या यह जांचना संभव है कि दिए गए प्रोग्राम को GNU ग्रिट इंस्ट्रूमेंटेशन के साथ संकलित किया गया है, यानी '-pg' ध्वज के साथ संकलक और लिंकर दोनों को पारित किया गया है, बिना यह जाँचने के लिए कि क्या यह एक gmon.outफ़ाइल उत्पन्न करेगा ?

जवाबों:


10

आप फ़ंक्शन के संदर्भ mcount(या संभवतः _mcountया प्रोफाइलिंग के कार्यान्वयन के__mcount अनुसार ) की जांच कर सकते हैं। यह फ़ंक्शन काम करने के लिए रूपरेखा के लिए आवश्यक है, और गैर-कुशल बायनेरिज़ के लिए अनुपस्थित होना चाहिए।

कुछ इस तरह:

$ readelf -s someprog | egrep "\s(_+)?mcount\b" && echo "Profiling is on for someprog"

ऊपर एक त्वरित परीक्षण पर यहाँ काम करता है।


2

ऊपर दिए गए उत्तर में नियमित अभिव्यक्ति हमेशा काम नहीं करती है ... लेकिन 'रीड-एस [बाइनरी]' के आउटपुट में "mcount" के लिए grepping का सामान्य विचार सही है, मुझे लगता है


0

उत्तरों में अधिक जोड़ना:

  1. इंस्ट्रूमेंटेशन की जांच करने के लिए, 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    
    
  2. किसी को -pgझंडे के साथ लिंक को संकलित करने की आवश्यकता है , अन्यथा gmon.outउत्पन्न नहीं किया जाएगा। stackoverflow लिंक।

  3. मैंने पाया कि जिस बाइनरी पर मैं ग्रिट कर रहा था, उसने झंडे के gmon.outसाथ संकलन / लिंक करने के बावजूद कोई फ़ाइल नहीं बनाई -pg। इसका कारण यह है - मैं अपने आवेदन को मार रहा था, यह एक साफ निकास नहीं था। gprofजब प्रोग्राम सामान्य रूप से बाहर निकलता है तो केवल आउटपुट उत्पन्न करता है। stackoverflow लिंक

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.