Чи можна перевірити, чи задана програма була складена за допомогою інструментарію 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"
Наведене тут працює на швидкому тесті.
Додавання більше відповідей:
Щоб перевірити наявність інструментів, 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
не буде генеровано. посилання stackoverflow.
Я виявив, що двійковий файл, на якому я працював gprof, не генерував жодного gmon.out
файлу, незважаючи на компіляцію / посилання з -pg
прапором. Причина в тому, що я вбив свою заяву, це був не чистий вихід. gprof
генерує вихід лише тоді, коли програма завершується нормально. посилання stackoverflow