gprof сообщает, что времени не накопилось - PullRequest
24 голосов
/ 23 июня 2009

Я пытаюсь профилировать приложение C ++ с помощью 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

Есть идеи?

Ответы [ 7 ]

11 голосов
/ 23 июня 2009

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

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

5 голосов
/ 24 июня 2009

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

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

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

Спасибо!

2 голосов
/ 26 января 2014

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

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

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

2 голосов
/ 13 октября 2011

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

2 голосов
/ 23 июня 2009

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

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

2 голосов
/ 23 июня 2009

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

0 голосов
/ 18 сентября 2018

точность времени в гпрофе 0.00. так что, возможно, ваш модуль занимает меньше времени (миллисек / микросекунда). Следовательно, он покажет 0.00 и время не накапливается. Итак, запустите всю программу примерно на 1000/1000000 times, чтобы она доходила до секунд. Наконец, разделите полученное время на коэффициент зацикливания (1000/1000000) и это будет ваше время обработки. Я тоже столкнулся с той же проблемой, и этим она решается.

...