Подтвердить что ты не робот

Gprof сообщает, что время не накапливается

Я пытаюсь профилировать приложение С++ с помощью gprof на машине под управлением OSX 10.5.7. Я компилирую с g++ обычным способом, но использую -pg флаги, запускаю приложение и пытаюсь просмотреть граф вызовов с помощью gprof.

К сожалению, мой график вызовов содержит все нули для всех столбцов времени. Значения в столбцах "вызываемые" имеют разумные значения, поэтому, похоже, что-то было профилировано, но я озадачен отсутствием других данных.

Все мои исходные файлы скомпилированы таким же образом:

g++ -pg -O2 -DNDEBUG -I./ -ansi -c -o  ScenarioLoader.o ScenarioLoader.cpp

Затем я запускаю 'ar' для объединения всех объектных файлов в библиотеку. Позже я связываю и запускаю gprof так:

g++ -pg -lm  -o vrpalone vrpalone.o ../src/atomicprof.a lastbuild.o
./vrpalone
gprof gmon.out | less

Любые идеи?

4b9b3361

Ответ 1

Я думал, что могу поделиться этим обсуждением списка рассылки Apple, с которым я недавно сталкивался.

Поведение, описанное здесь, является именно тем, что я испытываю. Похоже, что gprof был сломан на OSX довольно долгое время.

Я прибегал к Акуле, который был предложен Дейвом Ригби.

Спасибо!

Ответ 2

Если ваша программа завершается нечистым способом, данные профиля не будут правильно написаны - как вы выходите из вашей программы?

Независимо от того, я настоятельно рекомендую использовать Shark вместо gprof - он очень прост в использовании и превосходит все в любом случае gprof - и не требует перекомпиляции вашей программы.

Ответ 3

Как быстро работает ваша программа? Если это очень быстро, это может быть слишком быстро для фактического профиля. У меня была эта проблема с очень простой программой обработки текста: когда я запускал ее с моим тестовым файлом sub-1kb, он сообщал все 0s в столбцах времени. Я решил это, пропустив весь текст "Великого Гэтсби". Попробуйте более крупный набор данных или зациклитесь на своих основных вычислениях несколько сотен раз.

Ответ 4

Использует ли ваша программа несколько потоков? Я столкнулся с этой проблемой с многопоточными программами в Linux, не уверен, что OS X будет иметь те же проблемы

Вот решение для проблемы многопоточности, которую я успешно использовал в прошлом.

Ответ 5

Btw, вы используете fork() в своем коде? Если это так, добавьте это в дочерний процесс сразу после fork():

extern void _start (void), etext (void);
monstartup ((u_long) &_start, (u_long) &etext);

Это помогло мне.

Ответ 6

Возможно, это не относится к вопросу OP, существует общий сценарий, в котором происходит "время не накапливается": если ваш код вызывает ядро ​​или библиотеки вызовов, не скомпилированные с помощью -pg, вы не увидите времени, накопленного за время провел там.