gperftools文件说, libprofiler
应该链接到目标程序:
$ gcc myprogram.c -lprofiler
(不改变程序的代码)。
然后程序应该与特定的环境变量来运行:
CPUPROFILE=/tmp/profiler_output ./a.out
现在的问题是:如何libprofile
有机会开始和结束时,仅仅装载了它一个分析器,但它的功能不叫?
目前该库(无构造函数的证明 )。 “CPUPROFILE”的所有场合在库中的代码不涉及到分析器在开始任何地方。
我的想法,在下一看?
按照文档所链接的网页时,下链接库,它描述了-lprofiler步骤是相同的针对与LD_PRELOAD选项共享对象文件链接。
共享对象的文件是不一样的只是头文件。 头文件包含由编译程序时抬头函数声明,这样的函数的名称解析,但名字只是名字,没有实现。 共享对象文件(的.so)包含的函数的实现。 欲了解更多信息,请参见下面的StackOverflow的答案 。
/trunk/src/profiler.cc的源文件 182线,拥有CPUProfiler构造,即检查是否分析应根据CPUPROFILE环境变量来启用或不(187线和230线)。
然后调用该文件中对237线路启动功能按照意见,析构函数调用273线的停止功能。
要回答你的问题,我相信132线CpuProfiler CpuProfiler::instance_;
是其中CpuProfiler被实例化的行。
这在gperftools文档中缺乏明确的已知问题看这里 。
我想探查得到与profile-handler.cc的底部看到的REGISTER_MODULE_INITIALIZER宏(以及在heap-checker.cc,heap-profiler.cc等)进行初始化。 这就要求的src /碱/ googleinit.h其限定了伪静态对象,其构造函数被加载库时被调用。 然后,该虚设构造函数调用ProfileHandlerRegisterThread(),它然后使用调用pthread_once变量初始化singleton对象(ProfileHandler :: instance_)。
功能REGISTER_MODULE_INITIALIZER模拟宏module_init()/宏module_exit()函数在Linux中加载内核模块看出。
(我的答案是基于2.0版本gperftools的)