gperftools CPU Profiler到底是怎么开始的?

时间:2012-11-29 06:19:28

标签: gcc linker dynamic-linking google-perftools gperftools

gperftools documentationlibprofiler应该与目标计划相关联:

$ gcc myprogram.c -lprofiler

(不更改程序代码)。

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

CPUPROFILE=/tmp/profiler_output ./a.out

问题是: libprofile如何在仅加载时启动和完成探查器,但不调用其功能?

该库中没有构造函数(proof)。 库代码中的All occasions of "CPUPROFILE"不会引用启动分析器的任何位置。

我没有想法,下一步去哪看?

2 个答案:

答案 0 :(得分:8)

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

共享对象文件与头文件不同。头文件包含在编译程序时查找的函数声明,因此函数的名称会解析,但名称只是名称,而不是实现。共享对象文件(.so)包含函数的实现。有关详细信息,请参阅the following StackOverflow answer

第182行的

Source file of /trunk/src/profiler.cc有一个CPUProfiler构造函数,它根据CPUPROFILE环境变量(第187行和第230行)检查是否应该启用性能分析。

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

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

gperftools文档中缺乏明确性是已知问题,请参阅here

答案 1 :(得分:0)

我认为使用在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()函数。

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

相关问题