[英]Line number in Google Perftools CPU profiler on MacOSX
我試圖在MacOSX上分析一些C ++程序。 所以我構建了google-perftools
,編寫了一個程序,使用MacPorts g ++ 4.7編譯,帶有-g
編譯器標志,並鏈接到libprofiler
。 然后我跑了:
CPUPROFILE=cpu.profile ./a.out
然后我運行pprof來生成輸出:
[hidden ~]$ pprof --text ./a.out cpu.profile
Using local file ./a.out.
Using local file cpu.profile.
Removing __sigtramp from all stack traces.
Total: 282 samples
107 37.9% 37.9% 107 37.9% 0x000000010d72229e
16 5.7% 43.6% 16 5.7% 0x000000010d721a5f
12 4.3% 47.9% 12 4.3% 0x000000010d721de8
11 3.9% 51.8% 11 3.9% 0x000000010d721a4e
9 3.2% 55.0% 9 3.2% 0x000000010d721e13
8 2.8% 57.8% 8 2.8% 0x000000010d721a64
7 2.5% 60.3% 7 2.5% 0x000000010d7222f0
6 2.1% 62.4% 6 2.1% 0x000000010d721a4c
6 2.1% 64.5% 6 2.1% 0x000000010d721b1f
6 2.1% 66.7% 6 2.1% 0x000000010d721e0c
5 1.8% 68.4% 5 1.8% 0x000000010d721fba
......
看起來perftools不會將地址轉換為函數名稱。
有誰知道我在這里缺少什么? 我該怎么做才能讓探查器生成正確的結果。
編輯:更多信息:它不是pprof或google-perftools的問題,但更像是gcc或macosx,因為Instrument.app還顯示地址而不是行號。 我不熟悉調試符號在Mac OS X下如何工作,所以我寧願認為這是我在這里丟失的東西,而不是gcc或Mac OS X中的錯誤。我想知道是否有人可以提供有關調試信息如何工作的一些提示對於Mac OS X.
這似乎與OS X 10.5中引入的地址空間布局隨機化 (ASLR)有關
我在gperftools問題跟蹤器上提交了問題#562 。 您可以通過傳遞-Wl,-no_pie
來禁用ASLR。
此外,如果您不必使用gperftools
,則Instruments
(隨Xcode
)值得一試。
我相信在這個平台上,調試符號保留在.o文件中,它們不會移動到可執行文件中。 要在gdb或分析器中獲取符號,您需要保存.o文件。 這可能意味着您需要分兩步編譯應用程序(編譯,然后鏈接)以保留.o文件。
有關其他信息,請參閱此問題 。
在查看pprof Perl源代碼時,通過使用nm
和c++filt
獲得符號名稱,因此您可以嘗試運行這些符號並找出它們無法工作的原因。 從pprof源看起來,它嘗試了一堆不同的命令行參數來覆蓋幾個版本的nm。 這是方法的總結
nm [-D] -n [-f] [ - demangle] object-file 2> / dev / nul [| CPP + FILT]
我放在括號中的部分是腳本在運行時確定的部分,如果您的平台和nm和c ++ filt版本需要的話。 嘗試上述所有組合,看看有效。 然后看一下pprof腳本的功能,也許可以通過添加一些printfs來實現。
祝好運。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.