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

Dan*_*nov 9 linker gcc dynamic-linking google-perftools gperftools

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

$ gcc myprogram.c -lprofiler
Run Code Online (Sandbox Code Playgroud)

(不改变程序代码).

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

CPUPROFILE=/tmp/profiler_output ./a.out
Run Code Online (Sandbox Code Playgroud)

问题是:libprofile当仅仅加载探测器时,如何有机会启动和完成探查器,但是它的功能没有被调用?

该库中没有构造函数(证明). 库代码中"CPUPROFILE"的所有情况都不会引用启动分析器的任何位置.

我没有想法,在哪里看下一个?

App*_*234 8

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

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

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

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

为了回答你的问题,我认为第132 CpuProfiler CpuProfiler::instance_;行是实例化CpuProfiler的行.

gperftools文档中缺乏明确性是已知问题,请参见此处.