Mendeteksi jika biner ELF dibangun dengan instrumentasi gprof?

11

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?

Jakub Narębski
sumber

Jawaban:

10

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.

Tikar
sumber
2

Ekspresi reguler dalam jawaban di atas tidak selalu berfungsi ... tetapi gagasan umum untuk memahami "mcount" dalam output 'readelf -s [binary]' benar, saya pikir

Ben
sumber
0

Menambahkan lebih banyak ke jawaban:

  1. 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    
    
  2. Orang perlu mengkompilasi dan juga tautan dengan -pgbendera, jika gmon.outtidak, tidak akan dihasilkan. tautan stackoverflow.

  3. 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

patah kaki
sumber