2013-09-22 181 views
5

使用gcc -pg -g編譯C++程序(至少,這些是我在Makefile中給出的參數;沒有任何有關執行命令的確鑿證據) 。程序運行到CWD設置爲我的主目錄正常完成。沒有編寫gmon.out文件。使用gcc編譯gmon.out後不寫gpg -pg -g

gcc是4.4.7。 OS是centos 6.

我的程序是使用fork/exec手動啓動的Perl守護進程啓動的。我已經驗證了CWD是我的主目錄,並且它是可寫的,通過讓守護進程在執行我的目標程序之前執行touch foo。據我所能研究,這應該不會影響程序的分析或寫入gmon.out(通常情況下)。

回答

1

也許你有這樣個月前解決,但我今天遇到的效果,所以我可以回答未來遊客:

沒有顯示錯誤消息,是gmon.out只是還沒有生成(和文本分析文件將是空的)。

這可能的一個原因是,如果您沒有main方法,或者在-mwindows a WinMain的情況下。例如。如果使用編譯器參數(gcc)-e或(vc)/entry或使用__main

我查看了gprof手冊,但沒有找到有關如何告訴它一個入口點的信息,所以我更改了代碼。

5

跑到同樣的問題,在CentOS 7上的g ++ 4.8.2。-pg出現在編譯和鏈接,運行過程&它正常退出,沒有gmon.out生成。

我通過用exit(status)取代_exit(status)來解決此問題。請注意,前者是_exit(3),系統調用,後者是exit(2),這是一種標準庫方法。

爲什麼這樣嗎?從gprof手冊頁:

配置文件程序必須調用「exit」(2)或正常返回,才能將配置文件信息保存在gmon.out文件中。

顯然,gmon.out的寫入依賴於(更高級別的)exit(2)。因此,檢查代碼是否使用exit(2)(來自stdlib)而不是_exit(3)(系統調用)。

+0

謝謝!我有同樣的問題。 – brokenfoot

0

這確實是晚了,但對於那些你誰是掙扎,你-pg編譯代碼後,你需要運行可執行文件才能產生gmon.out