Заставить callgrind показывать все вызовы функций в графе вызовов kcachegrind

Я использовал инструмент valgrind - callgrind и kcachegrind для профилирования большого проекта, и мне было интересно, есть ли способ, которым callgrind сообщает статистику по всем функциям (не только самым дорогим функциям).

Если быть точным - когда я визуализировал callgraph в kcachegrind, он включал только те функции, которые довольно дороги, но мне было интересно, есть ли способ включить все функции из проекта в callgraph. Команда, используемая для генерации информации профилирования, приведена ниже:

valgrind --dsymutil=yes --tool=callgrind $EXE 

Я не уверен, что мне придется давать какие-либо параметры valgrind или я могу скомпилировать приложение при другой оптимизации. Это может быть что-то тривиальное, но я не мог найти решение. Любые указатели относительно этого высоко ценятся.

Спасибо!

3 ответа

введите описание изображения здесь

Это произошло со мной вчера. Как показано на рисунке, я обнаружил, что в графе вызовов kcachegrind есть меню, вызываемое правой кнопкой мыши, в котором вы можете установить порог, выше которого будет визуализироваться узел.

Также есть опция "нет минимума", однако ее нельзя выбрать. Я думаю, возможно, это потому, что если каждая функция, независимо от того, насколько она тривиальна, занимает узел, график может быть слишком большим для обработки.

Я только что обнаружил, что скрипт gprof2dot может справиться с этим.
Скрипт может преобразовать вывод callgrind в точку, которая может быть визуализирована в виде графика. Скрипт имеет два соответствующих параметра:

  • -n PERCENTAGE, --node-thres=PERCENTAGE удалить узлы ниже этого порога [по умолчанию: 0,5]. Чтобы визуализировать все узлы на графике, вы можете установить такой параметр как -n0
  • -e PERCENTAGE, --edge-thres=PERCENTAGEустранить края ниже этого порога [по умолчанию: 0,1]. Чтобы визуализировать все ребра на графике, вы можете установить параметр как -e0

Для того, чтобы сгенерировать полный граф вызовов, вы должны использовать оба варианта (-n0 а также -e0).

Я попробовал это, однако, поскольку сгенерированный график слишком велик, точечное программное обеспечение предупредило меня, что "график слишком велик для растровых изображений cairo-renderer. Масштабирование по размеру 0.328976". Но вы можете установить формат вывода как eps который может справиться с этим. Вы также можете изменить параметр, чтобы адаптировать свою цель.

пример

Допустим, у вас есть выходной файл callgrind с именем callgrind.out.1992, Для создания полного графа вызовов вы должны использовать:

gprof2dot.py -n0 -e0 ./callgrind.out.1992 -f callgrind

Для генерации PNG Для вывода изображения графика вы можете запустить следующие команды:

gprof2dot -n0 -e0 ./callgrind.out.1992 -f callgrind > out.dot

dot -Tpng out.dot -o out.png

Теперь у вас есть out.png изображение с полным графиком.

Обратите внимание на использование -f параметр для указания формата профиля (callgrind в нашем случае).

Я использую командуvalgrind --tool=callgrind --dump-instr=yes --collect-jumps=yes $EXE и, насколько я видел, он включает в себя все функции в графе вызовов.

Надеюсь, поможет.

Я собираюсь дополнить ответ Ренгара информацией, которая позволит вам сгенерировать полную диаграмму вызовов, а также привести пример всего процесса.

Вы можете использовать gprof2dot, чтобы показать все функции в графе вызовов. Скрипт может преобразовать вывод callgrind в точку, которая может быть визуализирована в виде графика. Скрипт имеет два соответствующих параметра:

  • -n PERCENTAGE, --node-thres=PERCENTAGE удалить узлы ниже этого порога [по умолчанию: 0.5]. Чтобы визуализировать все узлы на графике, вы должны установить для этого параметра значение -n0
  • -e PERCENTAGE, --edge-thres=PERCENTAGEустранить края ниже этого порога [по умолчанию: 0.1]. Чтобы визуализировать все ребра на графике, вы должны установить этот параметр в -e0

Для генерации полного графа вызовов вы должны использовать оба варианта: -n0 а также -e0,

пример

Допустим, у вас есть выходной файл callgrind с именем callgrind.out.1992, Для создания полного графа вызовов вы должны использовать:

gprof2dot -n0 -e0 ./callgrind.out.1992 -f callgrind

Чтобы сгенерировать выходное изображение PNG графика, вы можете запустить следующие команды:

gprof2dot -n0 -e0 ./callgrind.out.1992 -f callgrind > out.dot

dot -Tpng out.dot -o out.png

Теперь у вас есть out.png изображение с полным графиком.

Обратите внимание на использование -f параметр для указания формата профиля (callgrind в нашем случае).

Другие вопросы по тегам