2011-06-02 55 views
14

我試圖用sprof來分析幾乎所有代碼都在共享庫中的軟件(ossim)。我已經生成的文件的分析,但是當我運行sprof,我得到以下錯誤:什麼引起sprof抱怨「由ld.so檢測到不一致」?

> sprof /home/eca7215/usr/lib/libossim.so.1 libossim.so.1.profile -p > log 
Inconsistency detected by ld.so: dl-open.c: 612: _dl_open: Assertion `_dl_debug_initialize (0, args.nsid)->r_state == RT_CONSISTENT' failed! 

我下面說的是我需要的libc版本至少2.5-34的指示,我的libc版本2.12。 2(Gentoo,內核2.6.36-r5)。

對於錯誤意味着什麼或者(更有意思)如何解決它,我找不到任何解釋,只有一半相關的谷歌結果是針對舊版Skype中的錯誤。

+2

據我所知,這是一個glibc中的錯誤,它顯示瞭如果你谷歌RT_CONSISTENT,並看看所有的紅帽bugzilla條目。我現在正在使用oprofile。 – MattSmith 2011-10-05 05:10:29

+0

不知道,如果它的工作原理,但在這個答案中有一些關於.so文件sprof用法的信息:http://stackoverflow.com/questions/1838989/gprof-how-to-generate-call-graph-for-functions- in-shared-library-that-linke – 2015-08-02 05:02:42

回答

5

我有點好奇,因爲這在OpenSuse 12.x中仍然存在。我原以爲09年左右最初報告的bug現在已經被修復了。我猜沒有人真的使用sprof。 (或者dl-open是如此脆弱以至於人們不敢碰它:-)

問題歸結爲用作dlopen參數的__RTLD_SPROF標誌。 採取任何簡單的程序,調用dlopen,或該標誌的第二個參數,你會得到相同的失敗的斷言。我使用的示例程序在http://linux.die.net/man/3/dlopen底部作爲一個例子

handle = dlopen(argv[1], RTLD_LAZY | __RTLD_SPROF); 

從我可以從一個快速瀏覽一下DL-open.c所知,這標誌短路一些dl_open做什麼。所以在斷言中指定的r_flag不會被設置爲RT_CONSISTENT。

+1

這是一種煩人的。許多人建議oprofile,但到目前爲止,我還沒有能夠建立這一點。你有關於如何配置共享庫的建議嗎? – dirac3000 2013-09-09 17:04:24

相關問題