【问题标题】:How to use Callgrind to profile specific functions?如何使用 Callgrind 分析特定功能?
【发布时间】:2018-10-29 16:08:27
【问题描述】:

this 之后,我用 CALLGRIND_xxx_INSTRUMENTATION 宏包装了我的函数。但是,我总是“内存不足”。

这是我的程序的简化版本,即使我可以在不使用宏的情况下运行 callgrind,但 callgrind 仍然会耗尽内存。

#include <cstdio>
#include <valgrind/callgrind.h>

void foo(int i)
{
  printf("i=%d\n", i);
}

int main()
{
   for (int i=0; i<1048576; i++)
   {
     CALLGRIND_START_INSTRUMENTATION;
     foo(i);
     CALLGRIND_STOP_INSTRUMENTATION;
   }
}

要运行它,“valgrind --tool=callgrind --instr-atstart=no ./foo >foo.out”。

我做错了吗?请帮忙。谢谢!

【问题讨论】:

    标签: valgrind profile callgrind


    【解决方案1】:

    CALLGRIND_START_INSTRUMENTATION 典型用例是跳过检测应用程序启动代码。如果你在循环中调用它,那么这在内存和 cpu 中都是昂贵的, 因为 callgrind 每次都会重新检测代码。

    如果您只对测量某些功能感兴趣,您应该 在循环之前的某个地方开始检测,然后在您感兴趣的函数调用之前/之后使用CALLGRIND_TOGGLE_COLLECT。 这将使用更少的 CPU 和更少的内存。

    如果您想执行上述操作,则应使用选项--instr-atstart=no--collect-at-start=no。然后,您在程序中的相关位置开始检测(例如,在启动/初始化代码之后)。然后,您可以在您感兴趣的函数中插入对CALLGRIND_TOGGLE_COLLECT 的调用。

    请注意,不要修改您的程序以调用 CALLGRIND_TOGGLE_COLLECT 来获取一堆函数, 你也可以使用一次或多次命令行选项--toggle-collect=&lt;function&gt;

    【讨论】:

    • 我试过 --toggle-collect=foo 但没有用。 callgrind.out.xxx 是空的。
    • 我刚试过,效果很好(debian 9,valgrind git 版本)。我建议你尝试一个非常小的应用程序,只有 main 调用 foo。没有 valgrind 客户端请求。然后执行: valgrind --tool=callgrind --instr-atstart=yes --collect-atstart=no --toggle-collect=foo ./simple_test
    猜你喜欢
    • 2012-11-21
    • 2016-08-12
    • 1970-01-01
    • 2017-10-28
    • 1970-01-01
    • 2015-03-04
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多