Я хотел бы получить хронологический журнал функций, вызываемых программой на 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()
позволяет мне видеть звонки в хронологическом порядке.
Есть ли способ записать только эту информацию в журнал?
Похоже, что 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;
}
Просто напишите
загромождать << «Имя_функция»;
в каждой функции. Это убило бы вашу производительность, но для этого и нужна регистрация.
Если вы хотите отслеживать вызовы, я бы порекомендовал комментировать и создавать doxygen doku, который может генерировать ваши колл-колл, если нет указателей на функции.
Если вам это не подходит, мы должны знать, для чего именно вам нужна эта регистрация.