গতিশীল বিশ্লেষণ পদ্ধতি
এখানে আমি কয়েকটি গতিশীল বিশ্লেষণ পদ্ধতি বর্ণনা করি।
গতিশীল পদ্ধতিগুলি আসলে কল গ্রাফ নির্ধারণের জন্য প্রোগ্রামটি চালায়।
গতিশীল পদ্ধতির বিপরীত স্থিতিশীল পদ্ধতি, যা প্রোগ্রামটি পরিচালনা না করে একা উত্স থেকে এটি নির্ধারণ করার চেষ্টা করে।
গতিশীল পদ্ধতির সুবিধা:
- ফাংশন পয়েন্টার এবং ভার্চুয়াল সি ++ কলগুলি ক্যাচ করে। এগুলি কোনও তুচ্ছ সফ্টওয়্যারগুলিতে প্রচুর সংখ্যায় উপস্থিত রয়েছে।
গতিশীল পদ্ধতির অসুবিধা:
- আপনাকে প্রোগ্রামটি চালাতে হবে, যা ধীর হতে পারে, বা আপনার নেই এমন একটি সেটআপ প্রয়োজন, যেমন ক্রস-সংকলন
- কেবলমাত্র ফাংশন যা প্রকৃতপক্ষে ডাকা হত তা প্রদর্শিত হবে। উদাহরণস্বরূপ, কমান্ড লাইন আর্গুমেন্টের উপর নির্ভর করে কিছু ফাংশন কল করা বা নাও করা যেতে পারে।
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
নির্দিষ্ট হার্ডওয়্যার ট্রেসিং সমর্থন ছাড়াও সম্ভবত সবচেয়ে দক্ষ পদ্ধতি, তবে আপনার কোডটি পুনরায় সংকলন করতে হবে এমন ডাউনসাইড রয়েছে।