2012-08-28 155 views
21

我正在通過以下方式「PERF」:調用堆棧

perf record -a --call-graph -p some_pid 

perf report --call-graph --stdio 

然後,我看到:

1.60%  my_binary my_binary    [.] my_func 
      | 
      --- my_func 
       |   
       |--71.10%-- (nil) 
       |   (nil) 
       |   
       --28.90%-- 0x17f310000000a 

我看不出哪些函數調用my_func,並將()。我會看到「無」和「0x17f310000000a」。難道我做錯了什麼?這可能不是調試信息問題,因爲有些符號會顯示,而其他符號則不會顯示。

更多信息:

  • 我捉迷藏的CentOS 6.2(內核2.6.32-220.4.1)。
  • perf rpm - perf-2.6.32-279.5.2.el6.x86_64。

回答

0

您是否嘗試過使用Zoom進行分析?它可以使用perf,自定義驅動程序或oprofile來收集樣本。如果您只想查看一個進程,請嘗試「線程時間」配置。

我很想知道Zoom的選項在獲得功能信息時是否比獨立的perf更好/不同。

+0

沒有嘗試縮放。我希望能夠免費使用perf。請縮放解決這個問題?從Zoom縮放使用perf是否容易?它在任何地方解釋過? – erezz

+0

對於最近的Linux發行版(內核2.6.38或更高版本),縮放將默認使用perf。如果你在2.6.32和2.6.37之間,你可能必須從pref頁面手動選擇perf驅動程序。我創建了自定義配置文件配置來訪問性能監視器事件,但聽起來你不需要做任何事情。定期的時間檔案應該爲你提供你正在尋找的callstack和符號數據。 – federal

+0

你的內核模塊不能正常卸載。 \ [edit]對於那些從這篇文章嘗試縮放並且無法卸載rrnotify的用戶,請首先卸載/ dev/rrnotify。 \ [edit]此外,如果您在非英語系統上運行,請在運行縮放前導出LC_ALL = C;縮放無法正確處理非英文數字格式。 – FeepingCreature

23

請確保您編譯的代碼爲-fno-omit-frame-pointergcc選項。

+11

或者嘗試'perf record --call-graph dwarf'(它不需要幀指針) – maxy

+0

爲你的配置文件安裝debuginfo軟件包,大部分時間你需要glibc,即debuginfo-install glibc –

11

就快,你就錯過了-G選項(你可能需要一個更近的PERF比一個安裝在系統上):

$ perf report --call-graph --stdio -G 

perf help report

-G, --inverted 
     alias for inverted caller based call graph. 
+0

-G只是在'perf report'中改變調用堆棧打印的順序;如果在'perf record'時沒有完整的調用堆棧記錄到'perf.data','-G'選項將不會有幫助。只需要啓用幀指針或矮人(可能不會移植到rh的2.6.32)來解碼'record'時的幀:http://www.brendangregg.com/perf.html#StackTraces「省略幀指針是破壞調試器的惡意編譯器優化「 – osgx

+0

請注意,'perf記錄'上的'-G'(而不是'report')由cgroup選擇,以防有人對cgroup造成混淆錯誤。 –