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.out
file?
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.out
file?
Jawaban:
Anda dapat memeriksa referensi berfungsi mcount
(atau mungkin _mcount
atau __mcount
sesuai 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 -pg
bendera, jika gmon.out
tidak, tidak akan dihasilkan. tautan stackoverflow.
Saya menemukan bahwa biner di mana saya menjalankan gprof tidak menghasilkan gmon.out
file apa pun , meskipun mengkompilasi / menghubungkan dengan -pg
flag. Alasannya - saya membunuh aplikasi saya, itu bukan jalan keluar yang bersih. gprof
menghasilkan output hanya ketika program keluar secara normal. tautan stackoverflow