[英]How do I get call parents for libc6 symbols (e.g. _int_malloc) with linux perf?
我正在使用linux perf對C ++應用程序進行性能分析,並使用GProf2dot獲得了不錯的控制流程圖。 但是,來自C庫(libc6-2.13.so)的某些符號占用了總時間的很大一部分,但沒有邊界。
例如:
_int_malloc
花費8%的時間,但沒有通話父母。 __strcmp_sse42
和__cxxabiv1::__si_class_type_info::__do_dyncast
總共花費大約10%的時間,並且有一個呼叫者,其名稱為0
,其中呼叫者2d6935c
, 2cc748c
和6
沒有呼叫者。 結果,我無法找出僅使用perf負責所有這些分配和動態轉換的例程。 但是,似乎其他符號(例如malloc
但沒有_int_malloc
)確實具有調用父級。
為什么perf不顯示_int_malloc的通話父母? 為什么找不到__do_dyn_cast的最終調用者? 而且,我是否可以通過某種方式修改設置,以便獲得此信息? 我使用的是x86-64,所以我想知道是否需要帶幀指針的(非標准)libc6。
更新:從3.7.0內核開始,可以使用perf record -gdwarf <command>
確定系統庫中符號的調用父級。
使用-gdwarf
,無需使用-fno-omit-frame-pointer
進行編譯。
原始答案:是的,目前(2012年5月24日),可能需要在x86_64上使用幀指針( -fno-omit-framepointer
)編譯libc6。
但是,開發人員當前正在努力允許perf工具使用DWARF展開信息。 這意味着不再需要幀指針來獲取x86_64上的回溯信息。 但是,Linus不希望在內核中放開DWARF。 因此,性能工具將在系統運行時保存寄存器,並使用libunwind庫在用戶空間性能工具中執行DWARF展開。
已經對該技術進行了測試,可以成功確定(例如) malloc
和dynamic_cast
調用方。 但是,補丁集尚未集成到Linux內核中,因此需要進行進一步的修訂才能准備就緒。
從探查器無法識別的例程中調用_int_malloc
和__do_dyn_cast
,因為該例程沒有符號表信息。
而且,看起來您正在顯示自己的(專有)時間 。 這僅對於在以下情況的例程中找到熱點很有用:a)自我時間很多,b)您可以修復。
還有后續原來的UNIX剖析原因profil
創建。 真正的軟件由幾乎花費所有時間調用其他函數的函數組成,並且您需要能夠在很多時間找到堆棧中的代碼,而不是在很多時候找到程序計數器。
所以,你需要配置perf
采取堆樣品,並告訴你的時間的百分比每個例程是在棧上。 如果它不僅報告例程,還報告代碼行,那就更好了,例如Zoom 。 最好在壁鍾時間采樣,這樣您就不會對IO視而不見。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.