0

我想使用 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()我可以按时间顺序查看调用。

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

4

2 回答 2

0

只需写一个 clog << "functionname"; 在每个功能中。会扼杀你的表现,但这就是日志记录的目的。

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

如果这不适合您,我们应该知道您究竟需要该日志记录什么。

于 2013-06-04T07:06:13.787 回答
0

看起来 callgrind_annotate 是为了用 callgrind 生成的数据来做这件事。给出一个简单的例子,它没有显示“baz”的原因仅仅是你的测试代码执行得如此之快,以至于与开销代码(例如动态库加载代码)所花费的时间相比,它所花费的执行时间相形见绌。

您可以使用 threshold 参数让 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;
}
于 2013-06-04T17:19:18.893 回答