部屋を掃除したら漫画が沢山出てきたので書く日記

漫画とか合唱とかUNIXとかLinuxとかについて書く日記です。

LD_BIND_NOWその後

LD_BIND_NOWに関する件、その後の調査結果です。
Solaris8にて、/usr/lib/libthread.so.1にリンクしているアプリケーションがハングする、という不具合
http://sunsolve.sun.com/search/document.do?assetkey=1-26-49843-1

に、あるアプリケーションが該当する事が判明しました。

何故判明したかというと、Web上で報告されているpstack情報

	-----------------  lwp# xx / thread# xx  --------------------
	fed1bf90 lwp_mutex_lock (fedd5560)
	fedad0b0 _sched_lock_nosig (fedce000, 91234d8, 0, fedce000, 0, 0) + 1c

と、アプリケーションがハングしたときのpstackの内容が一致していたからです。

で、100%不具合が再現する環境を作る事に成功したので、この環境で、SunからWorkaroundとして提示されている、
環境変数にLD_BIND_NOW=1を設定してから実行

を行うとハングが生じなくなりましたので、この不具合を踏んでいる可能性が非常に高い、という結論になりました。


で、なぜLD_BIND_NOW=1を設定すると不具合が回避されるのか。これは結局わかりませんでした。

Sunから提示されているのは、lazy binding(遅延BINDと訳せば良いのか)の中で、libthreadを読み込む処理についての不具合が/usr/lib/libthread.so.1にあるので、non-lazy bindingをすればその処理を回避できる、という事でした。

具体的にどこの処理の事なのかは判りません。lazy bindingとnon-lazy bindingの時のtruss結果とか、LD_DEBUG=allを設定してデバッグ情報取得してそれぞれ比較してみましたが、僕には箇所を特定する事ができませんでした。。。

まあ、直る事は直るし、パッチも出てるし、充てて問題でなければ良いのではないかと。

自分で作ったアプリケーションじゃないので、できるのはここまでだと思いますし。。。

しかしアプリケーションの挙動を調べる手法の勉強にはなりました。忘れないようにここに記しておこう。

ではー。