Профилирование c++ кода под nix.

Опубликовано SergeyOs - пн, 04/20/2020 - 15:41

Два часто используемых способа профилирования c++ программ под юникс подобные системы с помощью утилит gprof и valgrind.

gprof

Если нет доступа к gui, например, работа в консоли, то этот способ подойдёт. Профилирование состоит из нескольких шагов.

  1. Собираем или пересобираем проект с флагом -pg.
  2. Запускаем программу на выполнение. После того как программа отработает появится файл gmon.out, с собранной информацией.
  3. Обрабатываем собранные данные утилитой gprof.
# если без автоматических сборщиков то:
> gcc -pg test.cpp -o test 
 
# если cmake, то собираем с флагами:
> cmake .. -DCMAKE_CXX_FLAGS=-pg -DCMAKE_EXE_LINKER_FLAGS=-pg -DCMAKE_SHARED_LINKER_FLAGS=-pg
> make
 
# запускаем
> ./test
# составляем отчёт
> gprof ./test gmon.out > profile.txt 

в profile.txt будет список функций отсортированный по времени выполнения и график в вызовов в текстовом виде.

valgrind

Если есть доступ к gui, то удобнее будет воспользоваться утилитой valgrind для сбора информации и kcachegrind для графического отображения собранной статистики.

Устанавливаем инструменты, которые понадобятся:

# opensuse
> sudo zypper in valgrind kcachegrind graphviz
 
#centos
> sudo yum install valgrind kdesdk-kcachegrind graphviz

далее выполняются шаги:

  1. Собрать проект (без всяких флагов)
  2. Запуск приложения через valgrind, появится файл с результатами работы callgrind.out.PID
  3. Открыть собранную информацию в kcachegrind
> gcc test.cpp -o test
# аргументы для приложения пишутся через пробел после имени программы
> valgrind --tool=callgrind ./test 
> kcachegrind callgrind.out.PID

В результате будут выведены красивые графики загрузки и вызовов. Всё достаточно удобно для анализа производительности и поиска узких мест.