Saya memiliki ruang kerja besar yang memiliki banyak file sumber kode C. Meskipun saya dapat melihat fungsi yang dipanggil dari fungsi di MS VS2005 menggunakan browser Objek, dan di MSVC 6.0 juga, ini hanya menampilkan fungsi yang dipanggil dari fungsi tertentu dalam jenis tampilan non-grafis. Selain itu, ia tidak menunjukkan fungsi yang dipanggil mulai dari say main()
, lalu fungsi yang dipanggil darinya, dan seterusnya, lebih dalam ke fungsi tingkat daun.
Saya membutuhkan alat yang akan memberi saya grafik panggilan fungsi secara bergambar dengan fungsi callee
dan caller
dihubungkan oleh panah atau sesuatu seperti itu, mulai dari main()
tingkat fungsi terakhir, atau setidaknya menunjukkan grafik panggilan semua fungsi dalam satu file sumber C secara bergambar. Akan sangat bagus jika saya bisa mencetak grafik ini.
Adakah alat yang bagus untuk melakukan itu (tidak perlu alat gratis)?
sumber
Jawaban:
Mesir (perangkat lunak gratis)
ncc
KcacheGrind (GPL)
Graphviz (CPL)
CodeViz (GPL)
sumber
Metode analisis dinamis
Di sini saya menjelaskan beberapa metode analisis dinamis.
Metode dinamis sebenarnya menjalankan program untuk menentukan grafik panggilan.
Kebalikan dari metode dinamis adalah metode statis, yang mencoba menentukannya dari sumber saja tanpa menjalankan program.
Keuntungan metode dinamis:
Kekurangan metode dinamis:
KcacheGrind
https://kcachegrind.github.io/html/Home.html
Program tes:
Pemakaian:
Anda sekarang tertinggal di dalam program GUI yang luar biasa yang berisi banyak data kinerja yang menarik.
Di kanan bawah, pilih tab "Grafik panggilan". Ini menunjukkan grafik panggilan interaktif yang berkorelasi dengan metrik kinerja di jendela lain saat Anda mengeklik fungsi.
Untuk mengekspor grafik, klik kanan dan pilih "Export Graph". PNG yang diekspor terlihat seperti ini:
Dari situ kita dapat melihat bahwa:
_start
, yang merupakan titik masuk ELF sebenarnya, dan berisi boilerplate inisialisasi glibcf0
,f1
danf2
dipanggil seperti yang diharapkan dari satu sama lainpointed
juga ditampilkan, meskipun kami memanggilnya dengan penunjuk fungsi. Ini mungkin tidak akan dipanggil jika kita telah memberikan argumen baris perintah.not_called
tidak ditampilkan karena tidak dipanggil saat proses, karena kami tidak meneruskan argumen baris perintah tambahan.Hal yang keren tentang itu
valgrind
adalah tidak memerlukan opsi kompilasi khusus.Oleh karena itu, Anda dapat menggunakannya bahkan jika Anda tidak memiliki kode sumber, hanya yang dapat dieksekusi.
valgrind
berhasil melakukannya dengan menjalankan kode Anda melalui "mesin virtual" yang ringan. Ini juga membuat eksekusi menjadi sangat lambat dibandingkan dengan eksekusi asli.Seperti yang dapat dilihat pada grafik, informasi pengaturan waktu tentang setiap pemanggilan fungsi juga diperoleh, dan ini dapat digunakan untuk membuat profil program, yang kemungkinan merupakan kasus penggunaan asli dari pengaturan ini, tidak hanya untuk melihat grafik panggilan: Bagaimana saya dapat membuat profil Kode C ++ berjalan di Linux?
Diuji di Ubuntu 18.04.
gcc -finstrument-functions
+ etracehttps://github.com/elcritch/etrace
-finstrument-functions
menambahkan callback , etrace mem-parsing file ELF dan mengimplementasikan semua callback.Sayangnya, saya tidak bisa membuatnya berfungsi: Mengapa `-finstrument-functions` tidak berfungsi untuk saya?
Output yang diklaim dalam format:
Mungkin metode yang paling efisien selain dukungan penelusuran perangkat keras tertentu, tetapi memiliki sisi negatif bahwa Anda harus mengkompilasi ulang kode.
sumber
Understand melakukan pekerjaan yang sangat baik dalam membuat grafik panggilan.
sumber
Perangkat Rekayasa Ulang Perangkat Lunak DMS kami memiliki analisis grafik kontrol / aliran data / titik-ke / panggilan statis yang telah diterapkan pada sistem besar (~~ 25 juta baris) kode C, dan menghasilkan grafik panggilan tersebut, termasuk fungsi yang dipanggil melalui penunjuk fungsi .
sumber
Anda dapat mencoba CScope + tceetree + Graphviz .
sumber
Anda dapat melihat generator pohon panggilan C berbasis bash saya di sini . Ini memungkinkan Anda menentukan satu atau lebih fungsi C yang Anda ingin pemanggil dan / atau disebut informasinya, atau Anda dapat menentukan sekumpulan fungsi dan menentukan grafik jangkauan panggilan fungsi yang menghubungkannya ... Yaitu beri tahu saya semua cara main ( ), foo (), dan bar () terhubung. Ini menggunakan graphviz / dot untuk mesin grafik.
sumber
Astrée adalah alat paling kuat dan canggih di luar sana, IMHO.
sumber