20

sprof を使用して、ほとんどすべてのコードが共有ライブラリにあるソフトウェア (ossim) のプロファイルを作成しようとしています。プロファイリング ファイルを生成しましたが、sprof を実行すると、次のエラーが発生します。

> 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!

私が従った指示によると、少なくとも 2.5-34 の libc バージョンが必要で、私は libc バージョン 2.12.2 (Gentoo、カーネル 2.6.36-r5) を持っています。

エラーの意味や (さらに興味深いことに) 修正方法についての説明が見つかりません。半分関連性のある Google の結果は、古いバージョンの Skype のバグに関するものだけです。

4

3 に答える 3

7

これは OpenSuse 12.x ではまだ壊れているため、少し興味がありました。2009 年ごろに最初に報告されたバグは、今では修正されていると思っていたでしょう。誰も本当にsprofを使っていないと思います。(あるいは、dl-open は壊れやすいので、触るのが怖いかもしれません :-)

この問題は、dlopen の引数として使用される __RTLD_SPROF フラグに要約されます。dlopen を呼び出す単純なプログラム、またはそのフラグを 2 番目の引数に渡すと、同じ失敗したアサーションが得られます。例としてhttp://linux.die.net/man/3/dlopenの下部にあるサンプル プログラムを使用しました。

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

dl-open.c をざっと見てわかることから、これは dl_open が行うことの一部を短絡させるフラグを立てます。したがって、アサーションで指定された r_flag は RT_CONSISTENT に設定されません。

于 2012-06-06T20:36:17.543 に答える