2012-11-29 28 views
9

gperftools documentationlibprofiler應該被鏈接到一個目標程序:gperftools CPU分析器到底有多精確?

$ gcc myprogram.c -lprofiler 

(不改變程序的代碼)。

然後程序應該與特定的環境變量來運行:

CPUPROFILE=/tmp/profiler_output ./a.out 

的問題是:如何libprofile有機會開始和結束時,它僅僅是加載一個分析器,但它的功能不叫?

該庫中沒有構造函數(proof)。 All occasions of "CPUPROFILE"庫代碼不涉及探查器啓動的任何地方。

我沒有想法,在哪裏看下?

回答

8

根據鏈接網頁的文檔鏈接庫,它描述了-lprofiler步驟與用LD_PRELOAD選項鍊接到共享對象文件的步驟相同。

共享目標文件不只是頭文件相同。頭文件包含函數聲明,這些函數聲明在編譯程序時被查找,所以函數的名稱會解析,但名稱只是名稱,而不是實現。共享對象文件(.so)包含函數的實現。欲瞭解更多信息,請參閱the following StackOverflow answer

Source file of /trunk/src/profiler.cc第182行有一個CPUProfiler構造函數,它根據CPUPROFILE環境變量(第187行和第230行)檢查是否啓用性能分析。

它然後調用237線啓動功能按照該文件中的註釋,析構函數調用停止功能上線273

要回答你的問題,我相信132線CpuProfiler CpuProfiler::instance_;是該行的地方CpuProfiler被實例化。

在gperftools文檔中缺乏清晰度是已知問題,請參閱here

+0

嗨Appleman1234,謝謝你的回答。 是的,您指出的行號與CPUPROFILE環境變量有關。 但他們檢查該env變量的_absence_,而不是存在。這意味着CpuProfiler已經根據探查器的鏈接在某處進行了實例化。所以鏈接(然後構造函數檢查變量是否存在等)。而且還沒有這樣的地方! 圖書館可以對加載做出反應,但這不是(我在OP的職位上放了一個教授)。 CpuProfile在哪裏(以及如何/爲什麼)只是因爲鏈接而自動實例化的任何想法? –

+0

哦對!這正是這個地方。感謝你的版本,最後它是完全清楚的。非常感謝。 –

0

我認爲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版本)