Callgrind хронологический журнал функций называется

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

Для примера программы на C ++ (simple.cpp) ниже:

void baz(){
}

void bar(){
for(int i = 0; i < 3; i++)
baz();
}

void foo(){
bar();
}

int main(){
foo();
return 0;
}

Я хочу получить
main() -> foo()-> bar->baz()*3

Что я пробовал:

Компилировать как g++ -g simple.cpp -o simple.out
и беги valgrind --tool=callgrind ./simple.out чтобы получить callgrind.out.3519

Бег callgrind_annotate --tree=both callgrind.out.3519 | grep baz ничего не возвращает.

поговорка kcachegrind callgrind.out.3519 а затем перемещаться в представлении исходного кода для функции main() позволяет мне видеть звонки в хронологическом порядке.

Есть ли способ записать только эту информацию в журнал?

0

Решение

Похоже, что callgrind_annotate предназначен именно для этого с данными, сгенерированными callgrind. Причина, по которой он не показывает «baz» в данном тривиальном примере, заключается просто в том, что ваш тестовый код выполняется так быстро, что время выполнения, потраченное на него, бледнеет по сравнению с временем, потраченным на код служебной информации (например, код загрузки динамической библиотеки).

Вы можете получить callgrind_annotate для включения вашего baz, используя параметр threshold:

callgrind_annotate --threshold=100 --tree=both callgrind.out.3519 | grep baz

Или, изменив пример:

int main(){
for(int i=0;i<1000000;i++9 {
foo();
}
return 0;
}
0

Другие решения

Просто напишите
загромождать << «Имя_функция»;
в каждой функции. Это убило бы вашу производительность, но для этого и нужна регистрация.

Если вы хотите отслеживать вызовы, я бы порекомендовал комментировать и создавать doxygen doku, который может генерировать ваши колл-колл, если нет указателей на функции.

Если вам это не подходит, мы должны знать, для чего именно вам нужна эта регистрация.

0