2009-06-23 42 views
23

我想在運行OSX 10.5.7的機器上用gprof剖析一個C++應用程序。 我以通常的方式用g ++編譯,但使用-pg標誌運行應用程序並嘗試使用gprof查看調用圖。gprof報告沒有時間積累

不幸的是,我的調用圖包含所有時間列的所有零。 「被調用」列中的值具有合理的值,因此它看起來像是一些特徵,但我對缺乏其他數據感到困惑。

我所有的源文件編譯以類似的方式:

g++ -pg -O2 -DNDEBUG -I./ -ansi -c -o ScenarioLoader.o ScenarioLoader.cpp 

我然後運行「AR」到所有的目標文件打包成庫。 後來,我鏈接和運行gprof的像這樣:

g++ -pg -lm -o vrpalone vrpalone.o ../src/atomicprof.a lastbuild.o 
./vrpalone 
gprof gmon.out | less 

任何想法?

+0

** gprof **自1982年以來一直存在。從那時起,計算機和語言的設計取得了巨大進展,但我們對性能問題的共同理解進展甚微。我們仍然鬆散地談論** gprof **引入的相同概念,而我們並沒有試圖真正理解它們。 [這是一些新的想法的討論和介紹。](https://stackoverflow.com/questions/1777556/alternatives-to-gprof/1779343#1779343) – 2009-11-23 21:33:34

回答

5

我想我可能會分享我最近遇到的this Apple mailing list discussion

這裏描述的行爲正是我所經歷的。 看起來gprof在OSX上已經打破了相當長的一段時間。

我已經使用了由Dave Rigby幫助建議的鯊魚。

謝謝!

11

如果您的程序以非乾淨的方式終止,那麼配置文件數據將無法正確寫入 - 您的程序如何退出?

無論如何,我強烈推薦使用Shark而不是gprof--它非常易於使用,並且在gprof的各種方式上都非常出衆 - 而且不需要您重新編譯程序。

+0

嗨戴夫。我的程序乾淨地終止。我看了一下鯊魚,當它工作時,我似乎無法讓它產生一個扁平的輪廓。我找到了一個扁平化選項,但它沒有顯示與gprof相同的信息,這是令人失望的;理想情況下,我希望將所有具有相同名稱的功能加在一起。我似乎也無法讓鯊魚顯示每個功能的呼叫數量。 – Daniel 2009-06-24 01:55:40

+0

我發現了「重視」選項來解決展平問題。仍然無法看到顯示呼叫數量的好方法。好吧。我覺得我夠了!歡呼戴夫的幫助。 – Daniel 2009-06-24 02:27:06

+0

強壯的鯊魚+1。在OSX上開發時,擊敗gprof或Google Perf Tools。 您可以通過選擇給定的行來查看確切的樣本數。然後它會在底部顯示該功能的樣本數量。很少這是有用的,但考慮到%是有用的。 – Tristan 2009-06-24 02:34:54

2

程序運行速度有多快?如果速度非常快,那麼實際配置文件可能太快。我遇到了一個非常簡單的文本處理程序的問題:當我用sub-1kb測試文件運行它時,它報告了時間列中的所有0。我通過運行偉大的蓋茨比的整個文本來解決這個問題。嘗試更大的數據集或循環執行幾百次主要計算。

2

您的程序是否使用多個線程?我在Linux上的多線程程序中遇到過這個問題,不知道OS X是否會遇到同樣的問題

這是一個solution以我過去成功使用的多線程問題。

2

也許與OP的問題沒有關係,有一個「沒有時間累積」發生的常見場景:如果你的代碼調用內核或調用的庫不是用-pg編譯的,你將不會看到任何積累的時間那裏。

2

順便說一句,你在你的代碼fork()嗎? 如果是這樣,在子進程剛叉(後)補充一點:

extern void _start (void), etext (void); 
monstartup ((u_long) &_start, (u_long) &etext); 

這奏效了我。