究竟如何gperftools CPU分析器开始?(How exactly does gperftoo

2019-08-03 07:06发布

gperftools文件说, libprofiler应该链接到目标程序:

$ gcc myprogram.c -lprofiler

(不改变程序的代码)。

然后程序应该与特定的环境变量来运行:

CPUPROFILE=/tmp/profiler_output ./a.out

现在的问题是:如何libprofile有机会开始和结束时,仅仅装载了它一个分析器,但它的功能不叫?

目前该库(无构造函数的证明 )。 “CPUPROFILE”的所有场合在库中的代码不涉及到分析器在开始任何地方。

我的想法,在下一看?

Answer 1:

按照文档所链接的网页时,下链接库,它描述了-lprofiler步骤是相同的​​针对与LD_PRELOAD选项共享对象文件链接。

共享对象的文件是不一样的只是头文件。 头文件包含由编译程序时抬头函数声明,这样的函数的名称解析,但名字只是名字,没有实现。 共享对象文件(的.so)包含的函数的实现。 欲了解更多信息,请参见下面的StackOverflow的答案 。

/trunk/src/profiler.cc的源文件 182线,拥有CPUProfiler构造,即检查是否分析应根据CPUPROFILE环境变量来启用或不(187线和230线)。

然后调用该文件中对237线路启动功能按照意见,析构函数调用273线的停止功能。

要回答你的问题,我相信132线CpuProfiler CpuProfiler::instance_; 是其中CpuProfiler被实例化的行。

这在gperftools文档中缺乏明确的已知问题看这里 。



Answer 2:

我想探查得到与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的)



文章来源: How exactly does gperftools CPU profiler start?