2013-06-04 5 views
0

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

Для программы пример 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

То, что я пробовал:

Compile в 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 включить ваш Баз либо с помощью порогового параметра:

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

Спасибо! Я, должно быть, пропустил - пороговый переключатель в документах. – Anirudh

0

Просто напишите clog < < "functionname"; в каждой функции. Убила бы вашу производительность, но для этого нужна регистрация.

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

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

+0

В идеале я хотел бы сделать это без изменения существующая база кода. Не могли бы вы дать мне указатель на второе решение, которое вы предложили выше? – Anirudh