gperftools CPU分析器到底如何启动?

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

$ gcc myprogram.c -lprofiler

(无需更改程序的代码)。

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

CPUPROFILE=/tmp/profiler_output ./a.out

现在的问题是: libprofile在加载时如何启动并完成一个分析器,但它的函数没有被调用?

该库中没有构造函数(证明)。 库代码中“CPUPROFILE”的所有场合都不涉及探查器启动的任何地方。

我没有想法,下一步该怎么看?


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

共享目标文件与头文件不同。 头文件包含函数声明,这些函数声明在编译程序时被查找,所以函数的名称会解析,但名称只是名称,而不是实现。 共享对象文件(.so)包含函数的实现。 有关更多信息,请参阅以下StackOverflow答案。

第182行的/trunk/src/profiler.cc源文件具有CPUProfiler构造函数,它根据CPUPROFILE环境变量(第187行和第230行)检查是否启用性能分析。

然后它调用第237行上的开始函数。根据此文件中的注释,析构函数在第273行调用Stop函数。

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

在gperftools文档中缺乏清晰性是已知问题,请参阅此处。


我认为profiler使用在profile-handler.cc(以及heap-checker.cc,heap-profiler.cc等)底部看到的REGISTER_MODULE_INITIALIZER宏进行初始化。 这将调用src / base / googleinit.h,该函数定义了一个虚拟静态对象,在加载该库时调用其构造函数。 然后,这个虚拟构造函数调用ProfileHandlerRegisterThread(),然后使用pthread_once变量来初始化单例对象(ProfileHandler :: instance_)。

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

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

链接地址: http://www.djcxy.com/p/87947.html

上一篇: How exactly does gperftools CPU profiler start?

下一篇: What exactly does C++ profiling (google cpu perf tools) measure?