2009-05-08

scim-helper-managerのcoreダンプをなんとかしたい

いつのころからか、ホームディレクトリにscim-helper-manager.coreができるようになっており、XfceにあるSCIMのアイコンを右クリックしても「SCIMを設定」のメニュー項目が出なくなってしまっていた。

これに関する最初の記述は、たぶん、[FreeBSD-users-jp 91512] 7.0-RELEASE で scim-helper-manager.core から始まるスレッドで、途中でsetupモジュールをロードするところがおかしいというところまで追求しているものの、いつのまにか ltdl.cpp 内で try_dlopen() が成功したら(エラー数が0なら)エラーを返すとかいう意味のわからない解決に終わってしまっている。

それ以外では、かけまわる子犬。: scim-helper-manager.core の core うざい・・。 で、.xsession 内で(kde起動前に) skim を起動することで、coreダンプしなくなるという記述があるが、何らかの依存関係が解消したなどの根本的な解決ではなさそうである。

また、めもがき:2009年1月中旬 によれば、NetBSDでも同様な問題があって、libpthreadがらみではないかという結論に至っている。

さらに最近、2chの FreeBSDを語れ Part23 にも関連の話題があり、NISユーザだと発生するだの、-gやgcc34を使えばいいだの、スレッドがらみでデバッグが困難だの、いろいろ情報が書かれている。

自分でも何とか解決できればと、SCIM 1.4.9を探し出して自家portを作ってみたり、コンパイラを変えてみたりしてみた。NISユーザの場合は、getpwuid() 内の getpwent_r() から呼ばれた yp_match() 内のさらに奥の _pthread_main_np() 内で落ちているということまではわかったが、libc を -g で作ってまで調べるには気合いと時間が足りない。それでも何とか、あちこちにデバッグプリントを入れてみたみたところ、どうやら dlopen/dlclose が関連している可能性が高く、ltdl.cpp 内の sys_dl_close() にある dlclose() を呼ぶ部分で、これを呼ばずにいきなり return してしまえば、とりあえずは落ちなくなることがわかった。

パッチはこんな感じ。

--- ./src/ltdl.cpp.orig 2008-11-02 15:42:40.000000000 +0900
+++ ./src/ltdl.cpp 2009-05-07 18:11:26.000000000 +0900
@@ -1073,6 +1073,7 @@
sys_dl_close (lt_user_data loader_data, lt_module module)
{
int errors = 0;
+ return errors; // Avoiding FreeBSD core-dump; don't know why this works

if (dlclose (module) != 0)
{

この続きは気力次第。


追記(5/11)

早速にも めもがき:2009年5月9日分 にて、詳しい解説つきのフォローをいただきました。ありがとうございます。

ビルド時のログをとって調べてみると、確かにライブラリのリンク時には -pthread がついていて、親のバイナリにはついていなかったりする。

というわけで、Makefileをいじって、configureに渡すLDCONFIGに -pthread を追加してみたところ、ぴたりと問題はおさまった。パッチを作って、メンテナに連絡してみたりする。

ところで、uim への乗り換えも検討して試してみたりしたことはあるのだが、どうもキーバインディングなどの微妙な問題なのか、uim-skk の使い勝手が悪い。xterm/kterm 上で Enter がわりに(Ctrl-M より楽だから)Ctrl-J を押す癖があることも一因かもしれないけど、firefox 上でもなんかバタバタして状態の把握がうまくできない。なので uim はお預け。最近 anthy 版portの出た ibus に注目中。

0 件のコメント: