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(); }
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
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
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!