Как использовать callgrind для профилирования только определенного периода выполнения программы?

Я хочу использовать valgrind для выполнения некоторого профилирования, так как он не нуждается в повторной сборке программы. (программа, которую я хочу профилировать, уже построена с помощью "-g" )

Но valgrind (callgrind) довольно медленный... так вот что мне делать:

  • запустите сервер (я хочу профилировать этот сервер)
  • вид прикрепления к этому серверу
  • прежде чем выполнить некоторую операцию на сервере, начните собирать данные профиля.
  • после выполнения операции, завершите сбор данных профиля
  • проанализировать данные профилирования.

Я могу делать такие вещи, используя солнечную студию на Solaris. (используя dbx). Я просто хочу знать, можно ли сделать то же самое, используя valgrind (callgrind)?

Спасибо

Ответы

Ответ 1

Вы должны посмотреть документацию callgrind и прочитать о callgrind_control.

  • Запустите приложение: valgrind --tool=callgrind --instr-atstart=no your_server.x
  • См. 1.
  • начать собирать данные профиля: callgrind_control -i on
  • end собирает данные профиля: callgrind_control -i off
  • Анализ данных с помощью kcachegrind или callgrind_annotate/cg_annotate

Ответ 2

Для профилирования только некоторой функции вы также можете найти полезные CALLGRIND_START_INSTRUMENTATION и CALLGRIND_STOP_INSTRUMENTATION из <valgrind/callgrind.h> заголовок и используя callgrind --instr-atstart=no, как предложено в Ответ Doomsday.

Ответ 3

Вы не говорите, какая ОС - я предполагаю Linux - в этом случае вы можете посмотреть oprofile (бесплатно) или Zoom (не бесплатно, но вы можете получить оценочную лицензию), оба из которых являются пробоотборниками пробоотбора и могут профилировать существующий код без повторной компиляции. Zoom намного удобнее и проще в использовании (у него есть графический интерфейс и некоторые дополнительные дополнительные функции), но вы, вероятно, уже имеете oprofile в своей системе.