Визначте, чи був побудований бінарний формат ELF за допомогою інструментів gprof?


11

Чи можна перевірити, чи задана програма була складена за допомогою інструментарію GNU gprof, тобто з прапором '-pg', переданим як компілятору, так і лінкеру, не запускаючи його, щоб перевірити, чи не генерує він gmon.outфайл?

Відповіді:


10

Ви можете перевірити наявність посилань на функцію mcount(або, можливо, _mcountабо __mcountвідповідно до Впровадження профілювання ). Ця функція необхідна для роботи з профілюванням і повинна бути відсутнім для непрофільованих бінарних файлів.

Щось на зразок:

$ readelf -s someprog | egrep "\s(_+)?mcount\b" && echo "Profiling is on for someprog"

Наведене тут працює на швидкому тесті.


2

Регулярний вираз у відповіді вище не завжди працює ... але загальна ідея привчання до "mcount" у висновку "readelf -s [binary]" правильна, я думаю


0

Додавання більше відповідей:

  1. Щоб перевірити наявність інструментів, grep для 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. Потрібно компілювати, а також зв’язувати з -pgпрапорами, інакше gmon.outне буде генеровано. посилання stackoverflow.

  3. Я виявив, що двійковий файл, на якому я працював gprof, не генерував жодного gmon.outфайлу, незважаючи на компіляцію / посилання з -pgпрапором. Причина в тому, що я вбив свою заяву, це був не чистий вихід. gprofгенерує вихід лише тоді, коли програма завершується нормально. посилання stackoverflow

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.