2012-06-07 20 views
20

找到符號使用perf report,我沒有看到任何符號我的程序,而不是我得到的輸出是這樣的:我怎樣才能PERF在我的計劃

$ perf record /path/to/racket ints.rkt 10000 
$ perf report --stdio 

# Overhead Command  Shared Object Symbol 
# ........ ........ ................. ...... 
# 
    70.06% ints.rkt [unknown]   [.] 0x5f99b8   
    26.28% ints.rkt [kernel.kallsyms] [k] 0xffffffff8103d0ca 
    3.66% ints.rkt perf-32046.map  [.] 0x7f1d9be46650 

這是相當不提供信息。

相關程序使用調試符號構建,sysprof工具顯示相應的符號,縮放也是如此,我認爲它使用的是perf

請注意,這是在x86-64上,所以二進制編譯爲,但在其他工具下運行也是如此。

+0

,並嘗試過它用'-fno-omit-frame-pointer',它沒有效果。 –

+0

您可以創建一個展示問題的最小示例嗎?從一個基本的二進制開始,它不會並且將這些差異平分。 –

+0

@BrianCain,相關的二進制文件非常大,因此平分並不是真的可行。不過,我會在一個簡單的程序上嘗試它,因爲也許這也不起作用,並且它會更容易追蹤。 –

回答

0

你的開發主機如何?它是否也運行x86_64操作系統? 如果沒有,請確保perf是交叉編譯的,因爲perf依賴於工具鏈中的objdump和其他工具。

+0

這不是一個交叉編譯的系統;構建=主機=目標。 –

0

您可以隨時使用'$ nm'命令。

這裏是一些樣本輸出:

Ethans-MacBook-Pro:~ phyrrus9$ nm a.out 
0000000100000000 T __mh_execute_header 
0000000100000f30 T _main 
       U _printf 
0000000100000f00 T _sigint 
       U _signal 
       U dyld_stub_binder 
1

請確保您使用-g選項與海灣合作委員會(CC)一起,這樣的調試信息在操作系統的本機格式生成編譯程序。 嘗試執行以下操作並檢查符號表中是否存在調試符號。

$objdump -t your-elf 
$readelf -a your-elf 
$nm -a your-elf 
0

得到了同樣的問題PERF通過prctl(PR_SET_NAME)

重寫我的程序的名稱後,我可以看到你的情況是很相似的:

70.06%整數。 rkt [unknown]

Command你已經執行(球拍)是不同的perf已見過。

0

您可以通過檢查kptr_restrict的值。如果結果中符號的地址全部爲0x000000,則可以通過命令echo 0 > sys/kernel/kptr_restrict修復它。在此之後,你可能會得到一個想要的結果perf report

11

這篇文章已經過了一年多了,但是因爲它出現在我的谷歌搜索結果的頂部,當我遇到同樣的問題時,我想我會在這裏回答。經過一番搜索後,我發現answer given in this related StackOverflow question非常有幫助。在我的Ubuntu鉚足了勁系統,然後我最終做了以下內容:作爲

record -g dwarf -F 97 /path/to/my/program 

  1. 編譯我的C++源代碼與-g(相當明顯,你需要調試符號)
  2. 運行perf方式perf能夠處理DWARF 2調試格式,這是在Linux上使用的標準格式gcc-F 97參數將採樣率降低到97 Hz。默認採樣率是我的系統顯然過大,導致了這樣的消息:

    Warning: 
    Processed 172390 events and lost 126 chunks! 
    
    Check IO/CPU overload! 
    

    perf report呼叫之後將失敗,並分段錯誤。隨着採樣率的降低,一切都很好。

  3. 在上一步中生成的perf.data文件沒有任何錯誤之後,您可以運行perf report等。我個人喜歡FlameGraph工具來生成SVG可視化文件。
  4. Other people報道,運行

    echo 0 > /proc/sys/kernel/kptr_restrict 
    

    爲根也能有所幫助,如果需要的內核符號。

0

我也有這個問題,我看不到任何用戶空間符號,但我看到了一些內核符號。我認爲這是一個符號加載問題。嘗試了所有可能的解決方案後,我仍然找不到它。

然後我依稀記得

的ulimit -u無限需要

。我試過了,它神奇地工作。

我從這個wiki中發現,當你使用太多的文件描述符時,需要這個命令。

https://perf.wiki.kernel.org/index.php/Tutorial#Troubleshooting_and_Tips

我最後的命令

PERF記錄-F 999 -g ./my_program

並不需要--call-圖