Apakah mungkin untuk memeriksa apakah program yang diberikan dikompilasi dengan instrumentasi gprof GNU, yaitu dengan bendera '-pg' diteruskan ke kompiler dan tautan, tanpa menjalankannya untuk memeriksa apakah akan menghasilkan gmon.outfile?
Apakah mungkin untuk memeriksa apakah program yang diberikan dikompilasi dengan instrumentasi gprof GNU, yaitu dengan bendera '-pg' diteruskan ke kompiler dan tautan, tanpa menjalankannya untuk memeriksa apakah akan menghasilkan gmon.outfile?
Jawaban:
Anda dapat memeriksa referensi berfungsi mcount(atau mungkin _mcountatau __mcountsesuai dengan Implementasi Profiling ). Fungsi ini diperlukan untuk membuat profil agar berfungsi, dan harus tidak ada untuk biner yang tidak diprofilkan.
Sesuatu seperti:
$ readelf -s someprog | egrep "\s(_+)?mcount\b" && echo "Profiling is on for someprog"
Di atas berfungsi pada tes cepat di sini.
Menambahkan lebih banyak ke jawaban:
Untuk memeriksa instrumentasi, ambil mcount / gmon:
$ readelf -s <binary> | egrep "gmon|mcount"
20: 0000000000401160 63 FUNC GLOBAL DEFAULT 12 __gmon_start__
28: 0000000000000000 0 FUNC GLOBAL DEFAULT UND mcount@GLIBC_2.2.5 (2)
36: 0000000000000000 0 FILE LOCAL DEFAULT ABS gmon-start.c
39: 00000000004011a0 0 FUNC LOCAL DEFAULT 12 call_gmon_start
100: 0000000000401160 63 FUNC GLOBAL DEFAULT 12 __gmon_start__
114: 0000000000000000 0 FUNC GLOBAL DEFAULT UND mcount@@GLIBC_2.2.5
Orang perlu mengkompilasi dan juga tautan dengan -pgbendera, jika gmon.outtidak, tidak akan dihasilkan. tautan stackoverflow.
Saya menemukan bahwa biner di mana saya menjalankan gprof tidak menghasilkan gmon.outfile apa pun , meskipun mengkompilasi / menghubungkan dengan -pgflag. Alasannya - saya membunuh aplikasi saya, itu bukan jalan keluar yang bersih. gprofmenghasilkan output hanya ketika program keluar secara normal. tautan stackoverflow