Gcc gperftools CPU分析器是如何启动的?

Gcc gperftools CPU分析器是如何启动的?,gcc,linker,dynamic-linking,google-perftools,gperftools,Gcc,Linker,Dynamic Linking,Google Perftools,Gperftools,说明应将libprofiler链接到目标程序: $ gcc myprogram.c -lprofiler (无需更改程序代码) 然后程序应使用特定的环境变量运行: CPUPROFILE=/tmp/profiler_output ./a.out 问题是:libprofile如果只加载了一个分析器,而没有调用它的函数,那么它是如何启动和完成的 该库()中没有构造函数。 在库代码中,不要引用启动探查器的任何位置 我没主意了,下一步该去哪里?根据链接网页的文档,在链接库下,它描述了-lprofile

说明应将
libprofiler
链接到目标程序:

$ gcc myprogram.c -lprofiler
(无需更改程序代码)

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

CPUPROFILE=/tmp/profiler_output ./a.out
问题是:
libprofile
如果只加载了一个分析器,而没有调用它的函数,那么它是如何启动和完成的

该库()中没有构造函数。 在库代码中,不要引用启动探查器的任何位置


我没主意了,下一步该去哪里?

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

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

在第182行,有一个CPUProfiler构造函数,它根据CPUPROFILE环境变量(第187行和第230行)检查是否应启用评测

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

要回答您的问题,我相信第132行
CpuProfiler CpuProfiler::instance\ux
是实例化CPU文件服务器的行


gperftools文档中的这种不清晰是已知的问题,请参见。

我认为探查器是通过profile-handler.cc(以及heap-checker.cc、heap-profiler.cc等)底部的REGISTER\u MODULE\u INITIALIZER宏初始化的。这将调用src/base/googleinit.h,它定义了一个虚拟静态对象,在加载库时调用该对象的构造函数。然后,该伪构造函数调用ProfileHandlerRegisterThread(),然后该函数使用pthread_once变量初始化singleton对象(ProfileHandler::instance_)

函数寄存器\模块\初始值设定项模拟Linux可加载内核模块中的模块\初始化()/模块\退出()函数


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

Hi Appleman1234,感谢您的回答。是的,您指出的行号与CPUPROFILE环境变量有关。但他们检查env变量是否存在,而不是是否存在。这意味着CpuProfiler已经在某个地方实例化了,具体取决于探查器的链接。所以链接(然后构造函数检查变量是否存在等)。现在还没有这样的地方!库可以在加载时做出反应,但这一个不能(我在OP post上放了一位教授)。有没有想到仅仅因为链接,CPU文件在哪里(以及如何/为什么)被自动实例化?哦,对了!就是这个地方。谢谢你的编辑,终于完全清楚了。非常感谢。