Скомпилировал программу на C ++, используя gcc -pg -g
(по крайней мере, это аргументы, которые я дал в Makefile; нет никаких веских доказательств того, какая команда была выполнена). Программа запустилась до нормального завершения с CWD в моем домашнем каталоге. Файл gmon.out не написан.
gcc составляет 4.4.7. ОС является Centos 6.
Моя программа была запущена вручную запущенным демоном Perl с использованием fork / exec. Я убедился, что CWD — это мой домашний каталог и что он доступен для записи, выполнив демон touch foo
как раз перед выполнением моей целевой программы. Насколько я мог исследовать, это не должно было повлиять на профилирование или написание программы gmon.out, когда она завершалась (обычно).
Столкнулся с этой же проблемой, g ++ 4.8.2 на CentOS 7. -pg
присутствовал как для компиляции, так и для компоновки, запустил процесс & выходит нормально, нет gmon.out
генерироваться.
Я исправил это, заменив звонок на _exit(status)
с exit(status)
, Обратите внимание, что первым является системный вызов _exit (3), а вторым — метод exit (2), стандартный метод библиотеки.
Почему это работает? От gprof
справочная страница:
Профилированная программа должна вызвать «exit» (2) или нормально вернуться, чтобы информация профилирования была сохранена в файле gmon.out.
Очевидно, что запись gmon.out зависит от (более высокого уровня) выхода (2). Итак, убедитесь, что код использует exit (2) (из stdlib), а не _exit (3) (системный вызов).
Может быть, вы решили это несколько месяцев назад, но я столкнулся с эффектом сегодня, чтобы я мог ответить для будущих посетителей:
Сообщение об ошибке не отображается, gmon.out просто не создается (и текстовый файл анализа будет пустым).
Одна из причин, почему это может быть, если у вас нет main
метод или в случае -mwindows
WinMain
, Например. если вы используете аргументы компилятора (GCC) -e
или (vc) /entry
или используя __main
,
Я просмотрел руководство по gprof, но не нашел информации о том, как сказать ему точку входа, поэтому я изменил код.
Это действительно поздно, но для тех из вас, кто борется, после того, как вы скомпилируете свой код с -pg
вам нужно запустить исполняемый файл для его генерации gmon.out