gmon.out не записывается после компиляции с помощью gcc -pg -g

Скомпилировал программу на C ++, используя gcc -pg -g (по крайней мере, это аргументы, которые я дал в Makefile; нет никаких веских доказательств того, какая команда была выполнена). Программа запустилась до нормального завершения с CWD в моем домашнем каталоге. Файл gmon.out не написан.

gcc составляет 4.4.7. ОС является Centos 6.

Моя программа была запущена вручную запущенным демоном Perl с использованием fork / exec. Я убедился, что CWD — это мой домашний каталог и что он доступен для записи, выполнив демон touch foo как раз перед выполнением моей целевой программы. Насколько я мог исследовать, это не должно было повлиять на профилирование или написание программы gmon.out, когда она завершалась (обычно).

7

Решение

Столкнулся с этой же проблемой, 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) (системный вызов).

8

Другие решения

Может быть, вы решили это несколько месяцев назад, но я столкнулся с эффектом сегодня, чтобы я мог ответить для будущих посетителей:

Сообщение об ошибке не отображается, gmon.out просто не создается (и текстовый файл анализа будет пустым).

Одна из причин, почему это может быть, если у вас нет main метод или в случае -mwindows WinMain, Например. если вы используете аргументы компилятора (GCC) -e или (vc) /entry или используя __main,

Я просмотрел руководство по gprof, но не нашел информации о том, как сказать ему точку входа, поэтому я изменил код.

1

Это действительно поздно, но для тех из вас, кто борется, после того, как вы скомпилируете свой код с -pgвам нужно запустить исполняемый файл для его генерации gmon.out

0
По вопросам рекламы [email protected]