c - कोड का एक सचित्र समारोह कॉल ग्राफ़ प्राप्त करने के लिए उपकरण



function call-graph (6)

कॉल ग्राफ़ बनाने का एक बहुत अच्छा काम समझता है

मेरे पास एक बड़ी कार्य स्थान है जिसमें सी कोड की कई स्रोत फ़ाइलें हैं I यद्यपि मैं ऑब्जेक्ट ब्राउज़र का उपयोग करके एमएस वीएस 2005 में फ़ंक्शन से बुलाए गए फ़ंक्शंस देख सकता हूं, और एमएसवीसी 6.0 में भी, यह केवल गैर-ग्राफिकल प्रकार के डिस्प्ले में किसी विशेष फ़ंक्शन से कहा जाता है। इसके अतिरिक्त, यह फ़ंक्शन, जो कि main() से शुरू होता है, को नहीं दिखाता है, और फिर फ़ंक्शन से फोन किया जाता है, और इसी तरह, पत्ती स्तर समारोह के अंदर गहरे अंदर।

मुझे एक उपकरण की ज़रूरत है जो मुझे एक फ़ंक्शन कॉल ग्राफ़ को चित्रमय रूप से तीर या caller जुड़े कार्यों के साथ चित्रित करना देगा, जो कि main() से लेकर कार्य के अंतिम स्तर तक हो, या कम से कम एक में सभी फ़ंक्शन का कॉल ग्राफ़ सी स्रोत फ़ाइल pictorially यह महान होगा अगर मैं इस ग्राफ को प्रिंट कर सकता हूं।

ऐसा करने के लिए कोई अच्छा उपकरण (नि: शुल्क उपकरण की आवश्यकता नहीं है)?



एस्ट्रियल सबसे मजबूत और परिष्कृत उपकरण है, आईएमएचओ।




KcacheGrind

https://kcachegrind.github.io/html/Home.html

उपयोग:

sudo apt-get install -y kcachegrind valgrind
gcc main.c
valgrind --tool=callgrind ./a.out
# Generates a callgrind.out.<PID> file.
kcachegrind callgrind.out.1234
# Opens a GUI to visualize callgrind data.

हैलो वर्ल्ड प्रोग्राम पर नमूना ग्राफ़ छवि निर्यात की गई:

इस पद्धति का लाभ यह है कि आपको कॉल ग्राफ देखने के लिए स्रोत कोड की आवश्यकता नहीं है, केवल निष्पादन योग्य।

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

इस प्रश्न का गैर सचित्र संस्करण: लिनक्स cflow में स्थानीय फ़ंक्शन कॉल्स का पता लगाने के लिए उपकरण एक अच्छा सरलीकृत विकल्प है।

gcc -finstrument-functions + एट्रेस

https://github.com/elcritch/etrace

-finstrument-functions कॉलबैक , एट्रेस पैरासिस ELF फ़ाइल जोड़ता है और सभी कॉलबैक लागू करता है।

मैं इसे दुर्भाग्य से काम नहीं कर सका: क्यों नहीं मेरे लिए 'फ़िस्ट्रस्ट्रम-फ़ंक्शन' काम करता है?

दावा किया गया आउटपुट प्रारूप का है:

\-- main
|   \-- Crumble_make_apple_crumble
|   |   \-- Crumble_buy_stuff
|   |   |   \-- Crumble_buy
|   |   |   \-- Crumble_buy
|   |   |   \-- Crumble_buy
|   |   |   \-- Crumble_buy
|   |   |   \-- Crumble_buy
|   |   \-- Crumble_prepare_apples
|   |   |   \-- Crumble_skin_and_dice
|   |   \-- Crumble_mix
|   |   \-- Crumble_finalize
|   |   |   \-- Crumble_put
|   |   |   \-- Crumble_put
|   |   \-- Crumble_cook
|   |   |   \-- Crumble_put
|   |   |   \-- Crumble_bake

विशिष्ट हार्डवेयर ट्रेसिंग समर्थन के अलावा सबसे प्रभावी विधि की संभावना है, लेकिन उस नकारात्मक पक्ष में है जिसे कोड को पुनः कंपाइल करना पड़ता है।





call-graph