সি ++ কোডের জন্য কীভাবে কলিং গ্রাফ তৈরি করা যায়


87

আমি কলিং গ্রাফ উত্পন্ন করার চেষ্টা করছি যার সাথে একটি নির্দিষ্ট ক্রিয়াকলাপটি হিট করছে এমন সমস্ত সম্ভাব্য সম্পাদনের পথগুলি সন্ধান করতে (যাতে আমাকে সমস্ত পাথ নিজেই খুঁজে বের করতে না হয়, কারণ অনেকগুলি পথ রয়েছে যা এই ফাংশনটির দিকে নিয়ে যায়) )। এই ক্ষেত্রে:

path 1: A -> B -> C -> D  
path 2: A -> B -> X -> Y -> D  
path 3: A -> G -> M -> N -> O -> P -> S -> D  
...  
path n: ...

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

কেউ কীভাবে এটি অর্জন করতে জানে?

উত্তর:


120
static void D() { }
static void Y() { D(); }
static void X() { Y(); }
static void C() { D(); X(); }
static void B() { C(); }
static void S() { D(); }
static void P() { S(); }
static void O() { P(); }
static void N() { O(); }
static void M() { N(); }
static void G() { M(); }
static void A() { B(); G(); }

int main() {
  A();
}

তারপর

$ clang++ -S -emit-llvm main1.cpp -o - | opt -analyze -dot-callgraph
$ dot -Tpng -ocallgraph.png callgraph.dot

কিছু চকচকে ছবি দেয় (একটি "বাহ্যিক নোড" রয়েছে, কারণ mainবাহ্যিক সংযোগ রয়েছে এবং অনুবাদ সংস্থার বাইরে থেকেও ডাকা হতে পারে):

কলগ্রাফ

আপনি c++filtএটির সাথে পোস্ট প্রসেস করতে চাইতে পারেন, যাতে আপনি জড়িত ফাংশন এবং ক্লাসগুলির অদম্য নামগুলি পেতে পারেন। নীচের মত

#include <vector>

struct A { 
  A(int);
  void f(); // not defined, prevents inlining it!
};

int main() {
  std::vector<A> v;
  v.push_back(42);
  v[0].f();
}

$ clang++ -S -emit-llvm main1.cpp -o - |
   opt -analyze -std-link-opts -dot-callgraph
$ cat callgraph.dot | 
   c++filt | 
   sed 's,>,\\>,g; s,-\\>,->,g; s,<,\\<,g' | 
   gawk '/external node/{id=$1} $1 != id' | 
   dot -Tpng -ocallgraph.png    

এই সৌন্দর্যের ফলন দেয় (ওরে আমার, অপটিমাইজেশন ছাড়াই চালু করা আকারটি খুব বড়!)

সৌন্দর্য

সেই রহস্যময় নামহীন ফাংশন, Node0x884c4e0এমন একটি স্থানধারক যাকে এমন কোনও ফাংশন দ্বারা ডাকা হবে বলে ধরে নেওয়া হয় যার সংজ্ঞাটি জানা যায় না।


24
আপনি কি একটি বহু ফাইল প্রকল্পে এটি করেছেন? সরঞ্জাম হিসাবে খুব দুর্দান্ত দেখাচ্ছে
ডাইরভাইন

4
+1 কোনও কারণে নামগুলি আনমেনগ করার জন্য আমাকে সি -+ ফিল্টের -n বিকল্পটি পাস করতে হয়েছিল। ভেবেছিলাম যে অন্য কেউ যদি একই সমস্যার মুখোমুখি হয় তবে আমি এখানে এটি উল্লেখ করব।
আকি

4
এটি চেষ্টা করার সময় আমি একটি ত্রুটি পেয়েছি: Pass::print not implemented for pass: 'Print call graph to 'dot' file'!এর সাথে কী হবে? ঝাঁকুনি 3.8
আরেন

4
এটি খুঁজে পেয়েছে: আমাকে -analyzeকোনও কারণে বিকল্পটি সরাতে হবে । আরেকটি প্রশ্ন: আমি কি আউটপুট ফাইলের নামটি অন্য কিছুতে সেট করতে পারি ./callgraph.dot?
আরনে

4
আমার দ্বিতীয় প্রশ্ন, বিভিন্ন ডিরেক্টরিতে একাধিক ফাইলের জন্য এই কমান্ডটি কীভাবে চালানো যায়?
নিউবি

18

আপনি অক্সিজেন ব্যবহার করে এটি অর্জন করতে পারেন (গ্রাফ তৈরির জন্য ডট ব্যবহারের বিকল্প সহ)।

এখানে চিত্র বর্ণনা লিখুন

জোহানেস স্কাউব - লিটব মেইন সিপিপি সহ এটি এটি উত্পন্ন করে:

এখানে চিত্র বর্ণনা লিখুন

ডোজ অক্সিজেন / ডট সম্ভবত ঝাঁকুনির চেয়ে সহজ / ইনস্টল এবং চালানোর জন্য পছন্দ। আমি নিজে এটি ইনস্টল করার ব্যবস্থা করিনি এবং সে কারণেই আমি বিকল্প সমাধান খুঁজতে চেষ্টা করেছি!


4
আপনি যে উইন্ডোটি অন্তর্ভুক্ত করেছেন সেটি পেতে কীভাবে ডক্সিজেন চালানো যায় তার একটি উদাহরণ যোগ করতে পারেন?
নিমজ্জন_নিঞ্জা

@ নিম্বল_নিঞ্জ: ডক্সিউজার্ড কনফিগারেশন ডায়ালগের স্ক্রিনশটটি কি যথেষ্ট নয়?
jpo38

4
আমি জানতাম না যে এটি ডক্সিউজার্ড থেকে এসেছে। ধন্যবাদ!
নিমজ্জন_নিঞ্জা

4
সর্বকালের সেরা পদ্ধতি! :)
লেসেলি এন

একটি বড় প্রকল্পের জন্য সত্যই কার্যকর নয়, 24 এইচ, দর্শনীয় গিগাবাইট এইচটিএমএল ডকুমেন্টেশন, এখনও করা হয়নি .. এটি এড়িয়ে চলে। আমার কয়েকটি নির্দিষ্ট ফাংশনের জন্য কেবল কল গ্রাফের প্রয়োজন (মূল গাছটি / থেকে / মধ্যের মধ্যে () <=> এসকিউএল_কমিট ())।
Gizmo

9

স্ট্যাটিক্যালি একটি নির্ভুল সি ++ কল গ্রাফ গণনা করা শক্ত, কারণ আপনার জন্য একটি নির্দিষ্ট সুনির্দিষ্ট ল্যাঙ্গেজ পার্সার, সঠিক নাম অনুসন্ধান এবং একটি ভাল পয়েন্ট-টু বিশ্লেষক প্রয়োজন যা ভাষা শব্দার্থকে সঠিকভাবে সম্মান করে। অক্সিজেনের এর কোনওটি নেই, আমি জানি না কেন লোকেরা এটি সি ++ এর জন্য পছন্দ করে বলে দাবি করে; এটি একটি 10 ​​লাইন সি ++ উদাহরণ তৈরি করা সহজ যা ডক্সিজেন ভুল করে বিশ্লেষণ করে))

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

সম্পাদনা: আমি হঠাৎ করে সি ++ এর জন্য বুঝতে পারলাম remembered , যা কল গ্রাফ তৈরির দাবি করে। আমি জানি না তারা পার্সারের জন্য কী ব্যবহার করেন, বা তারা বিশদ বিশ্লেষণটি সঠিকভাবে করেন কিনা; তাদের পণ্যটির সাথে আমার কোনও নির্দিষ্ট অভিজ্ঞতা নেই।

স্ক্যাংয়ের উত্তর দেখে আমি মুগ্ধ, ক্ল্যাং ব্যবহার করে; আমি আশা করব যে ক্ল্যাংয়ের সমস্ত উপাদান ঠিক আছে।


দুর্ভাগ্যক্রমে আমি সেই সমস্ত ব্যবহারের ক্ষেত্রে সচেতন নই যা এই ফাংশনটিকে ট্রিগার করতে পারে :(। সত্যিকার অর্থে, আমার চূড়ান্ত লক্ষ্য হ'ল ডিবাগিংয়ের উদ্দেশ্যে সেই ফাংশনটি ব্যবহার করে এমন মামলার সঠিক তালিকা খুঁজে বের করা to কোড ইনডেক্সিং সরঞ্জাম সহ সরাসরি কলার, তবে আরও বিশ্লেষণের জন্য সমস্ত কার্যকরকরণের পথগুলি বের করা দরকার
শিওমিং

সুতরাং আপনি যা চান তা বাস্তবায়ন শর্ত যা একটি পদ্ধতি বলা হয়? তারপরে আপনার প্রয়োজনীয়, সঠিক কল গ্রাফ এবং কল গ্রাফের বিভিন্ন নোডের নিয়ন্ত্রণ প্রবাহের সাথে চলার জন্য একটি সরঞ্জামের অপূর্ণতা প্রয়োজন, শর্তসাপেক্ষ অভিব্যক্তি সংগ্রহ করা, যতক্ষণ না কাঙ্ক্ষিত পদ্ধতিটি না দেখা যায়। আমি জানি না যে অফ-দ্য শেল্ফ সরঞ্জামগুলি এটি করবে (প্রশ্নের চেয়ে 7 বছর পরে এই মন্তব্য করবে); এটি করার জন্য আপনার সম্ভবত কাস্টম বিশ্লেষণ ইঞ্জিনের প্রয়োজন হবে। এ নিয়ে ঝনঝনানি চাপতে পারে; আমাদের ডিএমএস টুলকিট এটির জন্য ব্যবহার করা যেতে পারে।
ইরা

5

আপনি CppD depend ব্যবহার করতে পারেন , এটি বিভিন্ন ধরণের গ্রাফ তৈরি করতে পারে

  • নির্ভরতা গ্রাফ
  • গ্রাফ কল করুন
  • বর্গ উত্তরাধিকার গ্রাফ
  • সংযোজন গ্রাফ
  • পাথ গ্রাফ
  • সমস্ত পাথ গ্রাফ
  • চক্র গ্রাফ

এখানে চিত্র বর্ণনা লিখুন


3

clang++কমান্ডের জন্য mpi.hদুটি অতিরিক্ত বিকল্পের মতো স্ট্যান্ডার্ড হেডার ফাইলগুলি সন্ধান করার জন্য -### -fsyntax-only, যেমন সম্পূর্ণ কমান্ডটি দেখতে হবে:

clang++ -### -fsyntax-only -S -emit-llvm main1.cpp -o - | opt -analyze -dot-callgraph

1

"সি ++ বিএসসি অ্যানালাইজার" কল গ্রাফ প্রদর্শন করতে পারে - বিএসএমকে ইউটিলিটি দ্বারা উত্পন্ন ফাইলটি পড়ে।


0

ডোজিজেন + গ্রাফভিজ বেশিরভাগ সমস্যার সমাধান করতে পারে যখন আমরা কল গ্রাফ তৈরি করতে চাই, পরের জনবলের হাতে হস্তান্তর।


0

স্কিটুলস বোঝা একটি দুর্দান্ত সরঞ্জাম, বিপরীত ইঞ্জিনিয়ারিংয়ের জন্য আমি যা জানি তার চেয়ে ভাল এবং উচ্চ মানের গ্রাফ তৈরি করে

তবে মনে রাখবেন এটি বেশ ব্যয়বহুল এবং ট্রায়াল সংস্করণটির প্রজাপতি কল গ্রাফটি কেবলমাত্র এক স্তরের কলের মধ্যে সীমাবদ্ধ রয়েছে (আইএমএইচওও আমি বিশ্বাস করি যে তারা এটি করতে তাদের নিজেদের সহায়তা করে না…)

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