2006年10月19日木曜日

(FreeBSD) sunbird-0.3がSegmentation faultで動かない

■ 要約



FreeBSDで、ports/deskutils/sunbirdにて、sunbird-0.3をインストールしたものの、Segmentation faultで動きません。いろいろ試したけど、結局、まだよくわかってません。



ただ、ports/deskutils/linux-sunbirdなら動くんですよね・・・



という話。



☆ ☆ ☆ ☆ ☆ ☆ 



sunbirdは、Mozillaから派生した一連のソフトの1つです。有名なWebブラウザのFirefox、そして、そこそこ有名なMailソフトのThunderbirdにつづく、第3番目?といえるもので、Sunbirdはカレンダーソフトというものです。日本語だと、カレンダーというよりは、スケジュール管理ソフトと呼んだようが、ぴったりあう気がします。



しかし、なぜか他の2つと比べるとあんまり話題にならないし、開発もあまり活発ではなさそう、ということで、今ひとつマイナーな感じがするのでありますが、最近、バージョン0.3がリリースされたようです。



このSunbirdは、iCal形式のファイルが扱えて、データはWebDAV上に保存することで、インターネットが使えるところなら、どこからでもスケジュール確認が可能になります。また、WindowsやLinux、FreeBSD版などいろいろで、ほんと、会社でも自宅でも、どこにいても、まったく同じスケジュールが見られるので、手帳いらずになる~~~えーと・・・私はこれまで一度として手帳というものを使ったことがないのですが~~~とっても便利なソフト。1年半前から、私も使ってました・・・過去形?最近、なんか使わなくなっちゃってました。バージョン0.2とかで作ったデータが、新しいSunbirdで読めなくなっちゃって、こんなん使ってられっかぁー!と激怒したことがあったからかな・・・



もっとも、最近は、Google Calendarでいいじゃないか、みたいな感じもしてきています。使ってないですけど。



☆ ☆ ☆ ☆ ☆ ☆ 



さて、さて、FreeBSDのports/deskutils/sunbirdもバージョン0.3へアップデートしていたので、とりあえずportupgradeしてみました。で、実行してみると・・・

% sunbird
Segmentation fault

うーん、動きません。実は、portsには、deskutils/linux-sunbirdというのもあって、Linuxバイナリのsunbirdもあるのですが、こっちなら動きます。



FreeBSD 6.1-STABLE、5.5-STABLEともに、FreeBSD nativeのほうは、Segmentation faultになりました。こういうときの原因究明の定番としては、プロファイル($HOME/.mozilla)を消してみるとか、余計な環境変数を消してみるとか、ホームディレクトリがNFS上にあるときは、ローカルディスク上にあるアカウントで試してみるとか、度胸でrootアカウントで実行してみるとか・・・いろいろ思いつくものを試してみたのですが、全部、Segmentation faultでした。



もっとも、0.3がリリースされる前にあった、0.3aとかいうバージョンのころのportsのsunbirdも、たしかSegmentation faultで動きませんでした。0.2のころは、FreeBSD nativeバイナリでも動いていたのに・・・



なんとなく気になったので、少しGoogleで情報を探してみると、

「sunbird -calendar」というおまじないで実行するイイ!

なんてのがありましたが、ぜんぜんだめでした。



FreeBSDのports/deskutils/sunbirdでインストールされるsunbirdというコマンドは、ただのラッパースクリプトなので、それを眺めていると、なにやら、「--debug」というオプションがあるらしいです。試してみました。これをつけるとデバッガのgdbつきで起動するのでした。



ここで、ちょっと脱線しますが、1つ気になるところがありました。起動するとき、変なメッセージが表示されるんですよね。

% sunbird --debug
expr: illegal option -- -
usage: expr [-e] expression
[: -eq: unexpected operator
expr: illegal option -- -
usage: expr [-e] expression
[: -gt: unexpected operator

exprコマンドでエラーが起きてるんですが、何だろうと思ってsh -vx /usr/local/bin/sunbirdとかやってさぐったところ、わかりました。



これは、exprコマンドの引数として、--debugというのを渡しているのですが、--debugがexprコマンド自体の動作に関するオプション引数だと解釈されてしまい、しかしそんな引数は知らないよ、ということで、exprコマンドがエラーを出してました。



man exprでマニュアルをナナメ読みしたところ、バッチリそれに該当するような話がのってました。「expr -e --debug ...」のように-eという引数を追加すれば、大丈夫とのことです。また、環境変数EXPR_COMPATをセットすると、-eを指定したと解釈されるようになるそうです。FreeBSDを使う人は、これを覚えておくといつか役立つかも?!



というわけで、

% setenv EXPR_COMPAT
% sunbird --debug

という感じで、それなりにシェルスクリプトsunbirdが実行されるようになります。



☆ ☆ ☆ ☆ ☆ ☆ 



さてgdbでみても、デバッグオプションなしでコンパイルしたバイナリがインストールされているので、シンボルが含まれてなくて、見てもぜんぜんわかりません。というわけで、デバッグオプション(-g)つきでコンパイルしなおしてみることにしました。



gdbでスタックトレースをとったところ、/usr/local/lib/libplds4.so.1 というライブラリが途中で通っていました。これは何なのか調べてみると・・・

% pkg_which /usr/local/lib/libplds4.so.1
nspr-4.6.1 nspr-4.6.1_2 nspr-4.6.3

ということで、nsprというパッケージに含まれるライブラリのようです。というわけで、nsprを、デバッグ用にシンボルつきでコンパイルしなおしてみます。



ports/devel/nspr/Makefile を眺めていると

CONFIGURE_ARGS= --disable-debug \
                --with-pthreads

というのがあるので、勘で、--disable-debug を --enable-debugにして、makeしなおしたところ、これで正解でした。



nsprを全部インストールしなおすのも面倒なので、ライブラリだけ、一時的に差し替えました。



# cd ...../nspr/work/nspr-4.6.3/mozilla/nsprpub/build/lib/ds
# ls
Makefile        libplds4.a      plarena.o       plvrsion.o
_pl_bld.h       libplds4.so.1   plhash.o
# mv /usr/local/lib/libplds4.so.1  /usr/local/lib/libplds4.so.1.ORG
# cp libplds4.so.1 /usr/local/lib/



nsprでインストールされる共有ライブラリは、全部で3つあるので、とりあえずそのほかも同様に差し替えて見ました。



とりあえず実行してみます。



% sunbird --debug
/usr/local/lib/sunbird/run-mozilla.sh -g /usr/local/lib/sunbird/sunbird-bin
MOZILLA_FIVE_HOME=/usr/local/lib/sunbird
  LD_LIBRARY_PATH=/usr/local/lib/sunbird:/usr/local/lib/sunbird/plugins:/usr/local/lib/mre/mre-0.3
DISPLAY=:0.0
DYLD_LIBRARY_PATH=/usr/local/lib/sunbird:/usr/local/lib/mre/mre-0.3
     LIBRARY_PATH=/usr/local/lib/sunbird:/usr/local/lib/sunbird/components:/usr/local/lib/mre/mre-0.3
       SHLIB_PATH=/usr/local/lib/sunbird:/usr/local/lib/mre/mre-0.3
          LIBPATH=/usr/local/lib/sunbird:/usr/local/lib/mre/mre-0.3
       ADDON_PATH=/usr/local/lib/sunbird
      MOZ_PROGRAM=/usr/local/lib/sunbird/sunbird-bin
      MOZ_TOOLKIT=
        moz_debug=1
     moz_debugger=
/usr/bin/gdb /usr/local/lib/sunbird/sunbird-bin -x /tmp/mozargs.xGW8aC
GNU gdb 6.1.1 [FreeBSD]
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-marcel-freebsd"...(no debugging symbols found)...
(gdb) run
Starting program: /usr/local/lib/sunbird/sunbird-bin
(no debugging symbols found)...(no debugging symbols found)...(no debugging symbols found)...(no debugging symbols found)...(no debugging symbols found)...(no debugging symbols found)...warning: Unable to get location for thread creation breakpoint: generic error
[New LWP 100152]
[New Thread 0x8053000 (LWP 100152)]



Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x8053000 (LWP 100843)]
0x28d8d5ba in __error () from /usr/lib/libpthread.so.2



(gdb) where
#0  0x28d8d5ba in __error () from /usr/lib/libpthread.so.2
#1  0x28d815ef in pthread_mutex_unlock () from /usr/lib/libpthread.so.2
#2  0x28d81119 in pthread_mutex_unlock () from /usr/lib/libpthread.so.2
#3  0x28d89811 in _pthread_cond_wait () from /usr/lib/libpthread.so.2
#4  0x28d89c56 in pthread_cond_wait () from /usr/lib/libpthread.so.2
#5  0x28d498d3 in pthread_cond_wait () from /lib/libc.so.6
#6  0x2826ee2f in PR_WaitCondVar (cvar=0x8053000, timeout=4294967295)
    at ../../.././../pr/src/pthreads/ptsynch.c:412
#7  0x2826f5bd in PR_Wait (mon=0x8245380, timeout=213108)
    at ../../.././../pr/src/pthreads/ptsynch.c:591
#8  0x2821ee43 in nsThread::Init ()
   from /usr/local/lib/sunbird/libxpcom_core.so
#9  0x28220b77 in nsThreadManager::GetCurrentThread ()
   from /usr/local/lib/sunbird/libxpcom_core.so
#10 0x281ca9df in NS_NewThread_P ()
   from /usr/local/lib/sunbird/libxpcom_core.so
#11 0x292efe22 in nsSocketTransportService::Poll ()
   from /usr/local/lib/sunbird/components/libnecko.so
#12 0x292bb0cd in ?? () from /usr/local/lib/sunbird/components/libnecko.so
#13 0x0821d800 in ?? ()
#14 0x28291130 in __JCR_LIST__ () from /usr/local/lib/libplds4.so.1
#15 0xbfbfcde8 in ?? ()
#16 0x2825b6a4 in ?? () from /usr/local/lib/sunbird/libxpcom_core.so
#17 0xbfbfcea0 in ?? ()
#18 0xbfbfce70 in ?? ()
#19 0xbfbfcdf8 in ?? ()
#20 0x281cb30e in nsGenericFactory::~nsGenericFactory ()
   from /usr/local/lib/sunbird/libxpcom_core.so
Previous frame identical to this frame (corrupt stack?)





libphreadの中で死んでいるわけですが、その原因を作ったであろう根っこの方、ptsynch.cを見てみましたが、このあたりです。



/*
* We're surrendering the lock, so clear out the locked field.
*/
cvar->lock->locked = PR_FALSE;



if (timeout == PR_INTERVAL_NO_TIMEOUT)
    rv = pthread_cond_wait(&cvar->cv, &cvar->lock->mutex);
else
    rv = pt_TimedWait(&cvar->cv, &cvar->lock->mutex, timeout);



えー、こんなんじゃ、ぜんぜんわかりません。



☆ ☆ ☆ ☆ ☆ ☆



sunbirdのほうも、デバッグオプションつきでコンパイルするにはどうするか?



結論から言えば、「make WITH_DEBUG=yes」とすればよいようです。



ports/deskutils/sunbird/Makefileを見てみますと、MOZ_OPTIONSというところに--enable-debugを追加すればよさそうですが、実はそれはだめでした。よーくMakefileを見ると



.include "${PORTSDIR}/www/mozilla/Makefile.common"



なんてものがあるので、ports/www/mozilla/Makefile.commonのほうを参照してみます。すると、



.if defined(WITH_DEBUG)
MOZ_OPTIONS+= --enable-debug    \
  --disable-strip
WITH_LOGGING= yes
.else
MOZ_OPTIONS+= --disable-debug    \
  --enable-optimize=${WITH_OPTIMIZE} \
  --enable-strip
.endif



というのが見つかります。なので、WITH_DEBUGをセットすればよいというわけ。



というわけで、これでgdbで実行してみて、スタックトレースを眺めてみましたが、あーーーー、わかりゃんせん!



とりあえずトレースログをココにおいておきます。



「20061018-sunbird-0.3-log.txt」をダウンロード





☆ ☆ ☆ ☆ ☆ ☆ 



(2006-11-07)
CDからインストールしたFreeBSD 6.2-BETA2では、sunbirdがちゃんと動きました。buildworldしたやつだとダメなのか(CPUTYPEとか?)、最近のSTABLEだと大丈夫なのか? どうなんだろう。





0 件のコメント:

コメントを投稿