কোডের চিত্রযুক্ত ফাংশন কল গ্রাফ পাওয়ার সরঞ্জামগুলি [বন্ধ]


107

আমার কাছে একটি বড় কাজের জায়গা রয়েছে যার সি কোডের অনেক উত্স ফাইল রয়েছে। যদিও আমি অবজেক্ট ব্রাউজারটি ব্যবহার করে এমএস ভিএস ২০০৫ এর কোনও ফাংশন থেকে ডাকা ফাংশনগুলি দেখতে পাচ্ছি এবং এমএসভিসি 6.০ তেও এটি কেবল কোনও গ্রাফিকাল ধরণের ডিসপ্লেতে কোনও নির্দিষ্ট ফাংশন থেকে ডাকা ফাংশনগুলি দেখায়। অতিরিক্তভাবে, এটি বলা থেকে শুরু করে ফাংশনটি প্রদর্শন করে না main()এবং এরপরে কল করা ফাংশনগুলি এবং এরপরে পাতার স্তরের ফাংশনটির আরও গভীরে।

আমার একটি সরঞ্জাম প্রয়োজন যা আমাকে চিত্রের মতো একটি ফাংশন কল গ্রাফ দেবে যা ফাংশনগুলির সাথে calleeএবং callerতীর বা এমন কিছু দ্বারা সংযুক্ত main(), ফাংশনের শেষ স্তর থেকে শুরু করে বা কমপক্ষে একটি সি উত্স ফাইলের সমস্ত ফাংশনের কল গ্রাফ চিত্রযুক্তভাবে দেখায়। আমি এই গ্রাফটি মুদ্রণ করতে পারলে দুর্দান্ত হবে।

এটি করার জন্য কোনও ভাল সরঞ্জাম (বিনামূল্যে সরঞ্জামের দরকার নেই)?


উত্তর:


54

2
কোডভিজ সম্পর্কে সন্ধান, আপনি যদি নিজের কোডটি পাস করেন তবে এটি কোড তৈরি করবে কিনা? বা আপনার নিজের কোডভিস দিয়ে গ্রাফ তৈরি করা উচিত?
মোহাম্মদ রেজা রেজওয়ানি

5
আমি শুধু মিশর চেষ্টা করেছি। এটি গ্রাফিক ভয়ঙ্কর। আমি অন্যদের সম্পর্কে নিশ্চিত নই।
ar2015

29

গতিশীল বিশ্লেষণ পদ্ধতি

এখানে আমি কয়েকটি গতিশীল বিশ্লেষণ পদ্ধতি বর্ণনা করি।

গতিশীল পদ্ধতিগুলি আসলে কল গ্রাফ নির্ধারণের জন্য প্রোগ্রামটি চালায়।

গতিশীল পদ্ধতির বিপরীত স্থিতিশীল পদ্ধতি, যা প্রোগ্রামটি পরিচালনা না করে একা উত্স থেকে এটি নির্ধারণ করার চেষ্টা করে।

গতিশীল পদ্ধতির সুবিধা:

  • ফাংশন পয়েন্টার এবং ভার্চুয়াল সি ++ কলগুলি ক্যাচ করে। এগুলি কোনও তুচ্ছ সফ্টওয়্যারগুলিতে প্রচুর সংখ্যায় উপস্থিত রয়েছে।

গতিশীল পদ্ধতির অসুবিধা:

  • আপনাকে প্রোগ্রামটি চালাতে হবে, যা ধীর হতে পারে, বা আপনার নেই এমন একটি সেটআপ প্রয়োজন, যেমন ক্রস-সংকলন
  • কেবলমাত্র ফাংশন যা প্রকৃতপক্ষে ডাকা হত তা প্রদর্শিত হবে। উদাহরণস্বরূপ, কমান্ড লাইন আর্গুমেন্টের উপর নির্ভর করে কিছু ফাংশন কল করা বা নাও করা যেতে পারে।

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

আপনি এখন একটি দুর্দান্ত জিইউআই প্রোগ্রামের ভিতরে রেখে গেছেন যাতে প্রচুর আকর্ষণীয় পারফরম্যান্স ডেটা থাকে।

নীচে ডানদিকে, "কল গ্রাফ" ট্যাবটি নির্বাচন করুন। এটি একটি ইন্টারেক্টিভ কল গ্রাফ দেখায় যা অন্য উইন্ডোতে কার্যকারিতা ক্লিক করার সাথে সাথে পারফরম্যান্স মেট্রিকের সাথে সংযুক্ত থাকে।

গ্রাফটি রপ্তানি করতে ডানদিকে ক্লিক করুন এবং "গ্রাফ রফতানি করুন" নির্বাচন করুন। রফতানি করা পিএনজি দেখে মনে হচ্ছে:

সেখান থেকে আমরা দেখতে পাচ্ছি:

  • মূল নোডটি _startযা প্রকৃত ELF প্রবেশ পয়েন্ট এবং এতে গ্লিবসি ইনিশিয়ালাইজেশন বয়লারপ্লেট রয়েছে
  • f0, f1এবং f2একে অপরের কাছ থেকে প্রত্যাশিত হিসাবে ডাকা হয়
  • pointedআমরা এটি একটি ফাংশন পয়েন্টার দিয়ে বললেও, এটিও প্রদর্শিত হয়। আমরা যদি কোনও কমান্ড লাইনের যুক্তিটি পাস করে থাকি তবে এটি ডাকা হত না।
  • not_called এটি প্রদর্শিত হয় নি কারণ এটি দৌড়ে ডাকা হয়নি, কারণ আমরা একটি অতিরিক্ত কমান্ড লাইন যুক্তিটি পাস করি নি।

সম্পর্কে দুর্দান্ত জিনিস valgrind জন্য কোনও বিশেষ সংকলনের বিকল্পের প্রয়োজন হয় না।

অতএব, আপনার যদি সোর্স কোড না থাকে তবে আপনি কেবল এটি কার্যকর করতে পারেন the

valgrindলাইটওয়েট "ভার্চুয়াল মেশিন" এর মাধ্যমে আপনার কোডটি চালিয়ে তা পরিচালনা করে। এটি দেশীয় মৃত্যুদন্ড কার্যকর করার তুলনায় মৃত্যুদন্ড কার্যকর করে তোলে slow

গ্রাফটিতে দেখা যায়, প্রতিটি ফাংশন কল সম্পর্কিত সময়সীমা সংক্রান্ত তথ্যও পাওয়া যায়, এবং এটি প্রোগ্রামটি ব্যবহার করতে ব্যবহার করা যেতে পারে, যা সম্ভবত এই কলাপগুলি দেখার জন্য কেবল এই সেটআপটির আসল ব্যবহারের ঘটনা নয়: আমি কীভাবে প্রোফাইল করতে পারি লিনাক্সে সি ++ কোড চলছে?

উবুন্টু 18.04 এ পরীক্ষিত।

gcc -finstrument-functions + ইটারেস

https://github.com/elcritch/etrace

-finstrument-functions কলব্যাক যোগ করুন , ইট্রেস ইএলএফ ফাইলকে পার্স করে এবং সমস্ত কলব্যাক প্রয়োগ করে।

দুর্ভাগ্যক্রমে আমি এটি কাজ করতে পারি না: কেন আমার জন্য in -সংশ্লিষ্ট-ক্রিয়াকলাপগুলি কাজ করে না?

দাবিযুক্ত আউটপুট বিন্যাসের:

\-- 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
কেবল দ্রষ্টব্য যে ডায়নামিক কল গ্রাফ কেবল প্রোগ্রামের এক রান coversেকে দেয়।
smwikedia

1
@ এসএমউইকিপিডিয়া হ্যাঁ, আমি আরও পরিষ্কার করে দেওয়ার উত্তরটি আপগ্রেড করেছি
সিরো সান্তিলি 郝海东 冠状 病 六四 事件

এছাড়াও এখানে ব্যাখ্যা - stackoverflow.com/questions/311840/...
tauseef_CuriousGuy


9

আমাদের ডিএমএস সফটওয়্যার reengineering টুলকিট হয়েছে স্ট্যাটিক নিয়ন্ত্রণ / dataflow / পয়েন্ট-টু / কল গ্রাফ বিশ্লেষণ যে সি কোড বিপুল ব্যবস্থা (~~ 25 লক্ষ লাইন) প্রয়োগ করা হয়েছে, এবং উত্পাদিত যেমন কল গ্রাফ, ফাংশন ফাংশন পয়েন্টার মাধ্যমে বলা সহ


1
আহা, দুর্দান্ত, এর 2016 এবং এখন একটি ডাউনভোটার দেখায়। আমি নিশ্চিত যে তার ডাউনটোট একটি সঠিক মূল্যায়নের ভিত্তিতে ছিল যা এই সরঞ্জামটি এটি করতে পারে না। ভাল, সম্ভবত না। এটি ওপি যা অনুরোধ করেছে তা নিশ্চিত করে।
ইরা বাক্সার

1
এটির মোকাবেলায় একটি উত্সাহ নিন। আমি যতক্ষণ না এটি আপনার সফটওয়্যার বা স্বত্বাধিকারী হিসাবে এটি কাজটি করবে ততক্ষণ আমি তা খেয়াল করি না :-)
সিরো সান্তিলি 郝海东 冠状 病 六四 事件 事件

7

গ্রাফটি পেতে এই সমন্বয়টি কীভাবে ব্যবহার করবেন, সেখানে কোনও টিউটোরিয়াল বা কমপক্ষে কিছু ব্যাখ্যা রয়েছে।
মুহাম্মদ ইউসুফ

@ মুহাম্মাদ ইউসুফ হ্যাঁ, একটি উইকি পৃষ্ঠা আছে
বিলিজয়ে

5

আপনি আমার বাশ-ভিত্তিক সি কল ট্রি ট্রি জেনারেটরটি এখানে পরীক্ষা করে দেখতে পারেন । এটি আপনাকে একটি বা একাধিক সি ফাংশন নির্দিষ্ট করতে দেয় যার জন্য আপনি কলার এবং / অথবা ডাকা তথ্য চান, বা আপনি ফাংশনগুলির একটি সেট নির্দিষ্ট করতে পারেন এবং তাদের সাথে সংযুক্ত ফাংশন কলগুলির পুনঃব্যবহারযোগ্যতা গ্রাফ নির্ধারণ করতে পারেন ... অর্থাৎ আমাকে সমস্ত উপায় প্রধান বলুন ( ), foo () এবং বার () সংযুক্ত রয়েছে। এটি গ্রাফিং ইঞ্জিনের জন্য গ্রাফভিজ / ডট ব্যবহার করে।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.