首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Callgrind来分析特定的函数?

如何使用Callgrind来分析特定的函数?
EN

Stack Overflow用户
提问于 2018-05-19 18:52:51
回答 1查看 1.5K关注 0票数 0

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

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

代码语言:javascript
复制
#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“。

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

EN

回答 1

Stack Overflow用户

发布于 2018-05-20 21:53:30

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

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

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

请注意,您还可以使用一次或多次命令行选项--toggle-collect=<function>,而不是修改您的程序来为一堆函数调用CALLGRIND_TOGGLE_COLLECT

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50424490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档