【问题标题】:Callgrind chronological log of functions calledCallgrind 调用函数的时间顺序日志
【发布时间】:2013-06-04 05:48:06
【问题描述】:

我想使用 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() -&gt; foo()-&gt; bar-&gt;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() 的源代码视图中导航,我可以按时间顺序查看调用。

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

【问题讨论】:

    标签: c++ logging valgrind trace callgrind


    【解决方案1】:

    看起来 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;
    }
    

    【讨论】:

    • 谢谢!我一定错过了文档中的 --threshold 开关。
    【解决方案2】:

    写一个 堵塞

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

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

    【讨论】:

    • 理想情况下,我想在不修改现有代码库的情况下执行此操作。你能给我一个指向你上面建议的第二种解决方案的指针吗?
    猜你喜欢
    • 1970-01-01
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    • 2017-12-14
    相关资源
    最近更新 更多