Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah saya boleh menjana graf panggilan untuk kod C untuk menggambarkan laluan pelaksanaan?

Bagaimanakah saya boleh menjana graf panggilan untuk kod C untuk menggambarkan laluan pelaksanaan?

Patricia Arquette
Lepaskan: 2024-12-01 01:41:12
asal
303 orang telah melayarinya

How can I generate a call graph for C   code to visualize execution paths?

Menjana Graf Panggilan untuk Kod C untuk Memvisualisasikan Laluan Pelaksanaan

Untuk menjana graf panggilan untuk kod C, kami berhasrat untuk mendedahkan semua potensi laluan pelaksanaan yang membawa kepada fungsi sasaran tertentu. Ini boleh memberi manfaat dalam menghapuskan pengenalan manual setiap laluan, terutamanya apabila berbilang laluan wujud.

Dalam contoh yang disediakan, fungsi sasaran ialah D. Untuk mencapai ini, kita boleh menggunakan langkah berikut:

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();
}
Salin selepas log masuk

Sebaik sahaja kami mempunyai kod kami, kami boleh menjana graf panggilan menggunakan arahan berikut:

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

Ini akan menghasilkan perwakilan visual graf panggilan.

Walau bagaimanapun, untuk mendapatkan nama fungsi sebenar dan bukannya rakan sejawatnya, kita boleh pascaproses graf menggunakan penapisan c:

#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=}  != id' | 
 dot -Tpng -ocallgraph.png    
Salin selepas log masuk

Ini akan menghasilkan lebih banyak graf panggilan bermaklumat, menunjukkan nama sebenar fungsi dan kelas yang terlibat.

Atas ialah kandungan terperinci Bagaimanakah saya boleh menjana graf panggilan untuk kod C untuk menggambarkan laluan pelaksanaan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan