कोड का चित्रांकन फ़ंक्शन कॉल ग्राफ प्राप्त करने के लिए उपकरण [बंद]


107

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

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

ऐसा करने के लिए कोई भी अच्छा उपकरण (मुफ्त उपकरण नहीं होना चाहिए)?


जवाबों:


54

2
CodeViz के बारे में अनुकूलन, यदि आप अपना कोड इस पर पास करते हैं कि यह कोड उत्पन्न करेगा या नहीं? या आपको खुद कोडविस द्वारा ग्राफ बनाना चाहिए?
मोहम्मद रेजा रेजवानी

5
मैंने सिर्फ मिस्र की कोशिश की। यह ग्राफिक भयानक है। मैं दूसरों के बारे में निश्चित नहीं हूं।
ar2015

29

गतिशील विश्लेषण के तरीके

यहाँ मैं कुछ गतिशील विश्लेषण विधियों का वर्णन करता हूँ।

डायनामिक तरीके वास्तव में कॉल ग्राफ को निर्धारित करने के लिए प्रोग्राम चलाते हैं।

गतिशील तरीकों के विपरीत स्थिर विधियां हैं, जो कार्यक्रम को चलाने के बिना अकेले स्रोत से इसे निर्धारित करने का प्रयास करते हैं।

गतिशील विधियों के लाभ:

  • फंक्शन पॉइंटर्स और वर्चुअल C ++ कॉल को पकड़ता है। ये किसी भी गैर-तुच्छ सॉफ़्टवेयर में बड़ी संख्या में मौजूद हैं।

गतिशील तरीकों का नुकसान:

  • आपको प्रोग्राम चलाना होगा, जो धीमा हो सकता है, या एक सेटअप की आवश्यकता होती है जो आपके पास नहीं है, जैसे कि क्रॉस-संकलन
  • केवल ऐसे कार्य जो वास्तव में कहे गए थे, दिखाए जाएंगे। उदाहरण के लिए, कमांड लाइन के तर्कों के आधार पर कुछ कार्यों को बुलाया जा सकता है या नहीं।

KcacheGrind

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

परीक्षण कार्यक्रम:

int f2(int i) { return i + 2; }
int f1(int i) { return f2(2) + i + 1; }
int f0(int i) { return f1(1) + f2(2); }
int pointed(int i) { return i; }
int not_called(int i) { return 0; }

int main(int argc, char **argv) {
    int (*f)(int);
    f0(1);
    f1(1);
    f = pointed;
    if (argc == 1)
        f(1);
    if (argc == 2)
        not_called(1);
    return 0;
}

उपयोग:

sudo apt-get install -y kcachegrind valgrind

# Compile the program as usual, no special flags.
gcc -ggdb3 -O0 -o main -std=c99 main.c

# Generate a callgrind.out.<PID> file.
valgrind --tool=callgrind ./main

# Open a GUI tool to visualize callgrind data.
kcachegrind callgrind.out.1234

अब आप एक भयानक GUI प्रोग्राम के अंदर रह गए हैं जिसमें बहुत सारे दिलचस्प प्रदर्शन डेटा हैं।

नीचे दाईं ओर, "कॉल ग्राफ़" टैब चुनें। यह एक इंटरेक्टिव कॉल ग्राफ़ दिखाता है जो अन्य विंडो में मेट्रिक्स के प्रदर्शन से संबंधित है, जैसा कि आप फ़ंक्शंस पर क्लिक करते हैं।

ग्राफ़ को निर्यात करने के लिए, इसे राइट क्लिक करें और "एक्सपोर्ट ग्राफ़" चुनें। निर्यात किया गया पीएनजी इस तरह दिखता है:

उस से हम देख सकते हैं कि:

  • रूट नोड है _start, जो कि वास्तविक ईएलएफ प्रवेश बिंदु है, और इसमें ग्लिबैक इनिशियलाइज़ेशन बॉयलरप्लेट है
  • f0, f1और f2एक दूसरे से अपेक्षित के रूप में कहा जाता है
  • pointedयह भी दिखाया गया है, भले ही हमने इसे फ़ंक्शन पॉइंटर के साथ बुलाया हो। यदि हम कमांड लाइन तर्क पारित कर चुके होते तो इसे नहीं बुलाया जाता।
  • not_called यह नहीं दिखाया गया है क्योंकि इसे रन में नहीं बुलाया गया, क्योंकि हमने एक अतिरिक्त कमांड लाइन तर्क पारित नहीं किया था।

इसके बारे valgrindमें अच्छी बात यह है कि इसके लिए किसी विशेष संकलन विकल्प की आवश्यकता नहीं है।

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

valgrindएक हल्के "आभासी मशीन" के माध्यम से अपना कोड चलाकर ऐसा करने का प्रबंधन करता है। यह देशी निष्पादन की तुलना में निष्पादन को बहुत धीमा बनाता है।

जैसा कि ग्राफ पर देखा जा सकता है, प्रत्येक फ़ंक्शन कॉल के बारे में समय की जानकारी भी प्राप्त की जाती है, और इसका उपयोग प्रोग्राम को प्रोफाइल करने के लिए किया जा सकता है, जो कि इस सेटअप के मूल उपयोग के मामले की संभावना है, न कि केवल कॉल ग्राफ़ को देखने के लिए: मैं कैसे प्रोफ़ाइल कर सकता हूं लिनक्स पर चलने वाला C ++ कोड?

उबंटू 18.04 पर परीक्षण किया गया।

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

https://github.com/elcritch/etrace

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

मैं इसे दुर्भाग्य से काम नहीं कर सका: मेरे लिए `-finstrument-functions` काम क्यों नहीं करता है?

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

\-- 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

विशिष्ट हार्डवेयर ट्रेसिंग समर्थन के अलावा सबसे कुशल विधि, लेकिन नकारात्मक पक्ष यह है कि आपको कोड को फिर से भरना होगा।


2
बस ध्यान दें कि डायनामिक कॉल ग्राफ़ केवल प्रोग्राम के एक रन को कवर करता है।
smwikipedia

1
@smwikipedia हाँ, मैंने यह स्पष्ट करने के लिए उत्तर को उन्नत किया है
Ciro Santilli

यहाँ भी समझाया गया - stackoverflow.com/questions/311840/…
tauseef_CuriousGuy


9

हमारे डीएमएस सॉफ़्टवेयर रेन्गिनियरिंग टूलकिट में सी कोड के विशाल सिस्टम (~~ 25 मिलियन लाइनों) पर लागू होने वाले स्थिर नियंत्रण / डेटाफ़्लो / पॉइंट-टू / कॉल ग्राफ़ विश्लेषण हैं , और फ़ंक्शन कॉलर्स के माध्यम से कॉल किए जाने वाले फ़ंक्शन सहित ऐसे कॉल ग्राफ़ का उत्पादन किया है ।


1
आह, अच्छा, इसका 2016 और अब एक डाउनवॉटर दिखाता है। मुझे यकीन है कि उनका डाउनवोट एक सटीक आकलन पर आधारित था कि यह टूल ऐसा नहीं कर सकता। खैर, शायद नहीं। यह सुनिश्चित करता है कि ओपी ने क्या अनुरोध किया है।
इरा बैक्सटर

1
उसका प्रतिकार करने के लिए उठो। मुझे इसकी परवाह नहीं है कि यह आपका सॉफ्टवेयर या मालिकाना है जब तक यह काम पूरा नहीं हो जाता है :-)
Ciro Santilli 郝海东 your your your

7

ग्राफ़ को प्राप्त करने के लिए इस संयोजन का उपयोग कैसे करें, क्या कोई ट्यूटोरियल है या कम से कम कुछ स्पष्टीकरण है।
मुहम्मद यूसुफ

@ मुहम्मद यूसुफ हाँ, एक विकी पेज है
बिली जोए

5

आप यहां मेरे बैश-आधारित सी कॉल ट्री जनरेटर की जांच कर सकते हैं । यह आपको एक या एक से अधिक सी फ़ंक्शन निर्दिष्ट करने देता है जिसके लिए आप कॉलर और / या कॉल की गई जानकारी चाहते हैं, या आप फ़ंक्शन का एक सेट निर्दिष्ट कर सकते हैं और फ़ंक्शन कॉल की रीचैबिलिटी ग्राफ निर्धारित कर सकते हैं जो उन्हें जोड़ता है ... यानी मुझे सभी तरीके बताएं ( ), फू (), और बार () जुड़े हुए हैं। यह एक रेखांकन इंजन के लिए ग्राफविज़ / डॉट का उपयोग करता है।


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