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

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

Любые идеи?


person Daniel    schedule 23.06.2009    source источник


Ответы (7)


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

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

person DaveR    schedule 23.06.2009
comment
Привет Дэйв. Моя программа завершается чисто. Я посмотрел на Shark, и хотя он работает, я не могу заставить его генерировать плоский профиль. Я нашел вариант выравнивания, но он не отображает ту же информацию, что и gprof, что разочаровывает; в идеале я хотел бы, чтобы все функции с одинаковым именем были добавлены вместе. Я также не могу заставить Shark отображать количество вызовов каждой функции. - person Daniel; 24.06.2009
comment
Я нашел вариант тяжелого просмотра, чтобы решить проблему сглаживания. Все еще не вижу хорошего способа отображения количества вызовов. Ну что ж. Думаю хватит! Спасибо за помощь, Дэйв. - person Daniel; 24.06.2009
comment
Сильный +1 для Акулы. Превосходит gprof или Google Perf Tools при разработке на OSX. Вы можете увидеть точное количество образцов, выбрав данную строку. Затем он показывает количество выборок для этой функции внизу. Редко это полезно, учитывая, что % - это то, что полезно. - person Tristan; 24.06.2009

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

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

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

Спасибо!

person Daniel    schedule 24.06.2009

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

person Fixee    schedule 13.10.2011

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

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

person bdk    schedule 23.06.2009
comment
Привет блокк. Моя программа на данный момент только однопоточная. Но я буду иметь в виду эту ссылку! - person Daniel; 24.06.2009

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

person psanf    schedule 23.06.2009
comment
Привет псанф. Моя программа работает некоторое время в зависимости от того, что я ей ввожу (она решает различные задачи коммивояжера). Я попытался профилировать его, используя небольшую задачу, включающую 318 городов, решение которой занимает около 30 секунд. - person Daniel; 24.06.2009
comment
Учитывайте время выборки. Если никакая функция не активна дольше, чем время выборки по умолчанию, 0,01 секунды, это также может привести к тому, что выборочные данные не будут найдены. См. также эту ссылку SO. - person sebkraemer; 10.04.2018

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

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

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

person Big Papoo    schedule 26.01.2014

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

person Tharun Meddi    schedule 18.09.2018
comment
Надеюсь, вы понимаете, что отвечаете на вопрос, которому сейчас около 9 лет, и автор вопроса, скорее всего, решил свою проблему или просто умер от старости (последний раз его видели здесь, в SO, в 2017 году). Кроме того, то, что вы предлагаете в качестве решения вопроса, является дубликатом того, что написано в последней части ответа psanf. - person sɐunıɔןɐqɐp; 18.09.2018