Saya mencoba membuat grafik panggilan yang dapat digunakan untuk mengetahui semua kemungkinan jalur eksekusi yang mengenai fungsi tertentu (sehingga saya tidak perlu mencari tahu semua jalur secara manual, karena ada banyak jalur yang mengarah ke fungsi ini ). Misalnya:
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: ...
Saya telah mencoba Codeviz dan Doxygen, entah bagaimana kedua hasil tidak menunjukkan apa-apa selain tujuan fungsi target, D. Dalam kasus saya, D adalah fungsi anggota kelas yang objeknya akan dibungkus dalam penunjuk cerdas. Klien akan selalu mendapatkan objek penunjuk cerdas melalui pabrik untuk memanggil D.
Adakah yang tahu bagaimana mencapai ini?
sumber
Pass::print not implemented for pass: 'Print call graph to 'dot' file'!
Ada apa dengan itu? dentang 3.8-analyze
opsi karena beberapa alasan. T lain: dapatkah saya menyetel nama file keluaran ke selain./callgraph.dot
?Anda dapat mencapainya dengan menggunakan doxygen (dengan opsi untuk menggunakan titik untuk pembuatan grafik).
Dengan Johannes Schaub - litb main.cpp, ini menghasilkan ini:
doxygen / dot mungkin lebih mudah daripada clang / opt untuk menginstal dan menjalankan. Saya tidak berhasil menginstalnya sendiri dan itulah mengapa saya mencoba mencari solusi alternatif!
sumber
Menghitung grafik panggilan C ++ yang akurat secara statis itu sulit, karena Anda memerlukan parser bahasa yang tepat, pencarian nama yang benar, dan penganalisis poin-ke yang bagus yang menghargai semantik bahasa dengan benar. Doxygen tidak memiliki semua ini, saya tidak tahu mengapa orang mengklaim menyukainya untuk C ++; mudah untuk membuat contoh 10 baris C ++ yang salah menganalisis Doxygen).
Anda mungkin lebih baik menjalankan profiler waktu yang mengumpulkan grafik panggilan secara dinamis (ini menjelaskan tentang kami) dan hanya menjalankan banyak kasus. Profiler tersebut akan menunjukkan kepada Anda grafik panggilan sebenarnya yang dilakukan.
EDIT: Saya tiba-tiba teringat Mengerti untuk C ++ , yang mengklaim dapat membuat grafik panggilan. Saya tidak tahu apa yang mereka gunakan untuk parser, atau apakah mereka melakukan analisis rinci dengan benar; Saya tidak memiliki pengalaman khusus dengan produk mereka.
Saya terkesan dengan jawaban Schaub, menggunakan Clang; Saya berharap Clang memiliki semua elemen dengan benar.
sumber
Anda dapat menggunakan CppDepend , ini dapat menghasilkan berbagai jenis grafik
sumber
Agar
clang++
perintah untuk menemukan file header standar sepertimpi.h
dua opsi tambahan harus digunakan-### -fsyntax-only
, yaitu perintah lengkap harus terlihat seperti:sumber
"C ++ Bsc Analyzer" dapat menampilkan grafik panggilan - dengan membaca file yang dihasilkan oleh utilitas bscmake.
sumber
doxygen + graphviz dapat menyelesaikan sebagian besar masalah ketika kami ingin membuat grafik panggilan, selanjutnya diserahkan ke tenaga kerja.
sumber
Scitools Understand adalah alat yang luar biasa , lebih baik dari semua yang saya ketahui tentang rekayasa balik , dan menghasilkan grafik berkualitas tinggi .
Tapi perhatikan itu cukup mahal dan bahwa versi uji coba memiliki grafik panggilan kupu - kupu yang terbatas hanya pada satu tingkat panggilan (IMHO saya yakin mereka tidak membantu diri mereka sendiri melakukannya ...)
sumber