Как использовать 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 в своей системе.