Можно ли проверить, скомпилирована ли данная программа с помощью инструментария GNU gprof, то есть с флагом '-pg', переданным и компилятору, и компоновщику, не запуская его, чтобы проверить, будет ли он генерировать gmon.out
файл?
источник
Можно ли проверить, скомпилирована ли данная программа с помощью инструментария GNU gprof, то есть с флагом '-pg', переданным и компилятору, и компоновщику, не запуская его, чтобы проверить, будет ли он генерировать gmon.out
файл?
Вы можете проверить ссылки на функцию mcount
(или, возможно, _mcount
или в __mcount
соответствии с реализацией профилирования ). Эта функция необходима для работы профилирования и должна отсутствовать для непрофилированных двоичных файлов.
Что-то типа:
$ readelf -s someprog | egrep "\s(_+)?mcount\b" && echo "Profiling is on for someprog"
Выше работает на быстрый тест здесь.
Регулярное выражение в ответе выше не всегда работает ... но я думаю, что общая идея поиска значения "mcount" в выводе 'readelf -s [binary]' верна
Добавляя больше к ответам:
Чтобы проверить наличие инструментов, 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
Нужно скомпилировать так же как ссылку с -pg
флагами, иначе gmon.out
не будет сгенерировано. ссылка на стек
Я обнаружил, что бинарный файл, на котором я запускал gprof, не генерировал никаких gmon.out
файлов, несмотря на компиляцию / связывание с -pg
флагом. Причина в том, что я убивал свою заявку, это был не чистый выход. gprof
генерирует вывод только тогда, когда программа выходит нормально. ссылка на стек