首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >究竟如何启动gperftools分析器?

究竟如何启动gperftools分析器?
EN

Stack Overflow用户
提问于 2012-11-29 06:19:28
回答 2查看 5.6K关注 0票数 10

gperftools文档libprofiler应该链接到目标程序中:

代码语言:javascript
复制
$ gcc myprogram.c -lprofiler

(不改变程序的代码)。

然后,程序应该使用特定的环境变量运行:

代码语言:javascript
复制
CPUPROFILE=/tmp/profiler_output ./a.out

的问题是:如何有机会启动和完成分析器时,它只是加载,但它的函数没有被调用?

该库(证明)中没有构造函数。库代码中的"CPUPROFILE“的所有场合不指启动分析器的任何地方。

我没有主意了,接下来去哪儿找呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-01 16:39:24

根据文档--链接的网页,在链接库下,它描述了-lprofiler步骤与使用LD_PRELOAD选项链接共享对象文件的步骤相同。

共享对象文件与头文件不一样。头文件包含函数声明,在编译程序时会查找这些声明,因此函数的名称可以解析,但是名称只是名称,而不是实现。共享对象文件(.so)包含函数的实现。有关更多信息,请参见下面的StackOverflow回答

源文件/主干/src/profiler.cc on Line 182有一个CPUProfiler构造函数,它根据CPUPROFILE环境变量(第187行和第230行)检查是否启用分析。

然后,它在Line 237上调用Start函数。根据该文件中的注释,析构函数调用第273行上的停止函数。

为了回答您的问题,我相信第132行CpuProfiler CpuProfiler::instance_;是实例化CpuProfiler的行。

这是众所周知的这里文档中缺乏清晰性的问题。

票数 8
EN

Stack Overflow用户

发布于 2013-08-07 06:29:36

我认为分析器是用配置文件-handler.cc底部的REGISTER_MODULE_INITIALIZER宏初始化的(以及堆检查器. in、add-profiler.cc等)。它调用src/base/googleinit.h,它定义了一个虚拟静态对象,其构造函数在加载库时被调用。这个虚拟构造函数然后调用ProfileHandlerRegisterThread(),然后使用pthread_once变量初始化单例对象(ProfileHandler::instance_)。

函数REGISTER_MODULE_INITIALIZER模拟module_init()/module_exit()函数,这些函数可以在Linux可加载内核模块中看到。

(我的答案是基于2.0版本的gperftools)

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

https://stackoverflow.com/questions/13619974

复制
相关文章

相似问题

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