gperftools文档说libprofiler应该链接到目标程序中:
$ gcc myprogram.c -lprofiler(不改变程序的代码)。
然后,程序应该使用特定的环境变量运行:
CPUPROFILE=/tmp/profiler_output ./a.out的问题是:如何有机会启动和完成分析器时,它只是加载,但它的函数没有被调用?
该库(证明)中没有构造函数。库代码中的"CPUPROFILE“的所有场合不指启动分析器的任何地方。
我没有主意了,接下来去哪儿找呢?
发布于 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的行。
这是众所周知的这里文档中缺乏清晰性的问题。
发布于 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)
https://stackoverflow.com/questions/13619974
复制相似问题