2010-01-29 32 views
19

क्या कोई गैर-खिलौना उपकरण है जो पूरे एप्लिकेशन का कॉल ग्राफ़ बना सकता है? मेरा मतलब यह नहीं है कि विधि-दर-विधि को इंगित करने के माध्यम से बस एक तस्वीर या ड्राइंग कॉल ग्राफ प्राप्त करना।पूरे एप्लिकेशन का कॉल ग्राफ़

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

दोनों स्थिर और गतिशील कॉल ग्राफ़ मांग में हैं; यद्यपि स्थैतिक एक और अधिक दिलचस्प है, तथ्य यह है कि यह अतिरंजित है स्वीकार्य है।

मैंने अभी तक सूट की कोशिश की है। हालांकि, यह फ्रीकॉल (जावा स्रोत उपलब्ध हैं) जैसी मध्यम आकार की परियोजनाओं को संभालने में सक्षम नहीं है। सूट उस प्रोजेक्ट पर 1.5 जीबी मेमोरी को कम करता है, और उसके बाद जेवीएम क्रैश होता है, जैसा कि यहां वर्णित है: http://www.sable.mcgill.ca/pipermail/soot-list/2008-July/001828.html

क्या कोई ऊपर वर्णित कॉल ग्राफ़ उत्पन्न करने के लिए कोई टूल सुझा सकता है? जावा या .NET भाषाएं ठीक हैं।

सादर, सार्ज

+4

हथौड़ा लें और 64-बिट प्लेटफ़ॉर्म का उपयोग करें और कुछ 6 जीबी या जो भी रूट के लिए JVM को असाइन करें ...;) – Lucero

+0

आप जावा के लिए एक कॉल ग्राफ़ बनाना चाहते हैं? सी के लिए? के लिये ...? मैं जावा का अनुमान लगा रहा हूं, लेकिन सी # के संदर्भ में इस धारणा को संदेह में बुलाया गया है। –

+0

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

उत्तर

2

सार्ज,

JProfiler एक सभ्य जावा प्रोफाइलर, जिस पर कॉल ग्राफ के रूप में अच्छी तरह से उत्पन्न होगा के रूप में आप XML स्वरूप में निर्यात करने के लिए अनुमति देता है।

मैंने सूट का उपयोग नहीं किया है, इसलिए मैं इस बात की टिप्पणी नहीं कर सकता कि जेपीरोफाइलर सूट की तुलना में कैसे खड़ा है, लेकिन उम्मीद है कि जेपीरोफाइलर को आवेदन की तुलना में 2.5-3 गुना स्मृति की आवश्यकता होगी।

+2

एक गतिशील विश्लेषक केवल कॉल ग्राफ़ का हिस्सा बना सकता है जिसे वास्तव में निष्पादन के दौरान पार किया जाता है। अर्ध-पूर्ण ग्राफ प्राप्त करने के लिए, आपको सिस्टम को पूरी तरह से व्यायाम करने की आवश्यकता है, और यह देखते हुए कि अधिकांश परीक्षण सूट केवल 70-80% तक पहुंचते हैं, वहां बहुत से संभावित कॉल होंगे जो बस सूचीबद्ध नहीं हैं। एक गतिशील विश्लेषण एक "कम अनुमानित" देता है। कोड का निरीक्षण करके एक स्थिर विश्लेषक (मेरा उत्तर देखें) कॉल ग्राफ़ को आंकड़े बताते हैं। चूंकि कोई भी सुरक्षित विश्लेषण रूढ़िवादी होना चाहिए, इसलिए एक स्थिर विश्लेषक "अतिवृद्धि" देते हैं, लेकिन यह किसी भी संभावित कॉल को याद नहीं करता है। –

+0

ओपी ने कहा कि वह गतिशील कॉल ग्राफ पीढ़ी के उपकरणों में भी रूचि रखेंगे, लेकिन आपका बिंदु अच्छी तरह से बनाया गया है। – jbranchaud

7

हमारे DMS Software Reengineering Toolkit सी, जावा और कोबोल के लिए वैश्विक कॉल ग्राफ़ बना सकते हैं। इन्हें इन-मेमोरी डेटा संरचना के रूप में गणना की जाती है, और फिर मनमाने ढंग से अन्य तथ्यों को इकट्ठा करने के लिए चलाया जा सकता है। (आप इसे किसी अन्य उपकरण पर निर्यात करने के लिए निर्यात कर सकते हैं, लेकिन एक बड़े कॉल ग्राफ़ के लिए निर्यात करने का समय और प्रयास केवल उस समय का विश्लेषण करने के लिए हावी होगा, इसलिए हम इसे निर्यात नहीं करते हैं। वाईएमएमवी।)।

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

डीएमएस कॉल (ग्राफ़िक निष्कर्षण प्रक्रिया) के हिस्से के रूप में विश्लेषण के लिए एक (रूढ़िवादी) वैश्विक बिंदुओं का उपयोग करता है, यह निर्धारित करने के लिए कि ऐसी अप्रत्यक्ष कॉल कहां जाती है, जबकि झूठी-सकारात्मक कम हो जाती है। डीएमएस को निकालने के अधिक उदाहरणों के लिए Flow analysis and call graphs देखें, और 250,000 कार्यों की प्रणाली से निकाला गया नमूना ग्राफ।

+0

ईरा, उपरोक्त टूलकिट मुझे नियंत्रण-प्रवाह ग्राफ प्रदान करेगा, सही? क्या यह एक प्रक्रिया निर्भरता ग्राफ भी प्रदान करता है, उसी तरह व्याकरण के लिए? (http://www.grammatech.com/research/papers/slicing/slicingWhitepaper.html) – Joeblackdev

+0

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

+0

क्या यह उपकरण स्वतंत्र रूप से उपलब्ध है? या यह एक वाणिज्यिक उत्पाद है? – Joeblackdev

1

बाहर http://semmle.com/

मैं उनके उपकरण का इस्तेमाल किया है, जब यह बीटा में था जाँच करें। यह प्रोग्राम जानकारी का डेटाबेस बनाता है जिसे आप प्रोग्रामेटिक रूप से क्वेरी कर सकते हैं। कंपनी एक स्टार्टअप है और उत्पाद बीटा में नहीं है, हालांकि मुझे अपनी साइट पर कहीं भी यह नहीं मिल रहा है कि इसे कैसे खरीदें या कितना खर्च होता है।

NDepend (http://www.ndepend.com/) .NET के लिए एक समान टूल है जिसका मैंने उपयोग किया है लेकिन मुझे यकीन नहीं है कि कोई इसे प्रोग्रामिक रूप से एक्सेस कर सकता है या नहीं।XDepend (http://www.xdepend.com/) जावा के लिए उनका उपकरण है, जिसका मैंने उपयोग नहीं किया है।

1

1.5 जीबी यथार्थवादी कॉल ग्राफ़ के लिए बहुत अधिक स्मृति नहीं है। मुझे लगता है कि सूट सिर्फ आपको वह देता है जो आप पूछ रहे हैं। अन्य उपकरणों द्वारा कॉल ग्राफ़ छोटे हो सकते हैं, लेकिन फिर वे अपूर्ण होंगे।

+0

हमने 26,000 संकलन इकाइयों के साथ एक प्रणाली के लिए 32 बिट एड्रेस स्पेस में 250,000 फ़ंक्शन के साथ उचित सटीक कॉल ग्राफ़ (फ़ंक्शन पॉइंटर्स के लिए पॉइंटर विश्लेषण का उपयोग करके) बनाया है। यह मेरे लिए बहुत यथार्थवादी लगता है। * अंक-से * विश्लेषण के लिए 95 गीगाबाइट्स वीएम की आवश्यकता होती है। (हाँ, जीबी)। –

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