如何使用Callgrind来分析特定的功能?

时间:2018-05-19 10:52:51

标签: valgrind profile callgrind

this之后,我用CALLGRIND_xxx_INSTRUMENTATION宏包装了我的函数。但是,我总是得到“记忆力不足”#34;

这是我的程序的简化版本,即使我可以在不使用宏的情况下运行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;
   }
}

要运行它,&#34; valgrind --tool = callgrind --instr-atstart = no ./foo> foo.out&#34;。

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

1 个答案:

答案 0 :(得分:0)

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

如果您只想测量某些功能,那么您应该这样做 在循环之前的某处开始检测,然后在您感兴趣的函数调用之前/之后使用CALLGRIND_TOGGLE_COLLECT。 这将使用较少的CPU和较少的内存。

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

请注意,不要修改程序以便为一堆函数调用CALLGRIND_TOGGLE_COLLECT, 您还可以使用命令行选项--toggle-collect=<function>

的一次或多次