Определить, был ли двоичный файл 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не будет сгенерировано. ссылка на стек

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

сломанная нога
источник