0

之后,我用 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”。

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

4

1 回答 1

2

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>

于 2018-05-20T13:53:29.847 回答