调用函数的Callgrind时间顺序日志

时间:2013-06-04 05:48:06

标签: c++ logging valgrind trace callgrind

我想使用valgrind获取C ++程序调用的函数的时间顺序日志,最好是在文本文件中。

对于下面的示例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()的源代码视图中导航,我可以按时间顺序查看调用。

有没有办法将这些信息写入日志?

2 个答案:

答案 0 :(得分:0)

写一个     clog&lt;&lt; “functionname”; 在每个功能。会破坏你的表现,但这就是记录的目的。

如果你想跟踪调用,我宁愿建议评论和构建doxygen doku,只要没有函数指针就可以生成调用者图。

如果这不适合您,我们应该知道您需要记录的确切内容。

答案 1 :(得分:0)

看起来callgrind_annotate与callgrind生成的数据完全相同。考虑到简单的例子,它没有显示“baz”的原因很简单,就是你的测试代码执行得如此之快,以至于在开销代码中花费的时间与开销代码中花费的时间(例如动态库加载代码)相比,其执行时间相形见绌。 / p>

您可以通过使用阈值参数来获取callgrind_annotate以包含您的baz:

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

或者通过改变示例:

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