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
Любые идеи?
Ответы
Ответ 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
, вы не увидите времени, накопленного за время провел там.