簡體   English   中英

我如何在Linux性能下獲得libc6符號(例如_int_malloc)的致電父母?

[英]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 ,其中呼叫者2d6935c2cc748c6沒有呼叫者。

結果,我無法找出僅使用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展開。

已經對該技術進行了測試,可以成功確定(例如) mallocdynamic_cast調用方。 但是,補丁集尚未集成到Linux內核中,因此需要進行進一步的修訂才能准備就緒。

從探查器無法識別的例程中調用_int_malloc__do_dyn_cast ,因為該例程沒有符號表信息。

而且,看起來您正在顯示自己的(專有)時間 這僅對於在以下情況的例程中找到熱點很有用:a)自我時間很多,b)您可以修復。

還有后續原來的UNIX剖析原因profil創建。 真正的軟件由幾乎花費所有時間調用其他函數的函數組成,並且您需要能夠在很多時間找到堆棧中的代碼,而不是在很多時候找到程序計數器。

所以,你需要配置perf采取堆樣品,並告訴你的時間的百分比每個例程是在棧上。 如果它不僅報告例程,還報告代碼行,那就更好了,例如Zoom 最好在壁鍾時間采樣,這樣您就不會對IO視而不見。

關於這一切還有更多要說的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM