Article freyasx/58 of [1-99] on the server localhost:7119
  upper oldest olders older1 this newer1 newers latest
search
[Top/Up] [oldest] - [Older+chunk] - [Newer+chunk] - [newest + Check]
[Reference:<_A57@freyasx.ML_>]
Newsgroups: mail-lists.freyasx

[FreyaSX] Re: fsearch.cgi 実行時 Segmentation fault
28 Sep 2005 00:38:48 GMT ysato@delegate.org (Yutaka Sato)
The DeleGate Project

In message <_A57@freyasx.ML_> on 09/27/05(22:59:30)
you 辻 智之 <pgqaaappw-jmfhzlypuedw.ml@delegate.org> wrote:
 |>などとしてやると、どこで異常終了しているかわかりますので、結果を見せて
 |>いただければ、対処できるかも知れません。
 |
 |$ gdb fsearch.cgi
...
 |Program received signal SIGSEGV, Segmentation fault.
 |0x401092fc in _IO_default_uflow (fp=0x806eee4) at genops.c:423
 |423     genops.c: No such file or directory.
 |        in genops.c

ということですので、最終的には、そのバージョンのGccの、genops.c という
ファイルの、423 行目で死んでいるということのようですね。

 |(gdb) bt
 |#0  0x401092fc in _IO_default_uflow (fp=0x806eee4) at genops.c:423
 |#1  0x40049b0b in streambuf::uflow () from /usr/lib/libstdc++-libc6.2-2.so.3
 |#2  0x4010849f in __uflow (fp=0x806eee4) at genops.c:377
 |#3  0x40103d1f in _IO_getc (fp=0x806eee4) at getc.c:41
 |#4  0x0805109f in sout_flush ()
 |#5  0x0804e9fb in main ()
 |#6  0x400ab336 in __libc_start_main (main=0x804e960 <main>, argc=1,
 |ubp_av=0xbffff384, init=0x8049f6c <_init>,
 |    fini=0x8063de0 <_fini>, rtld_fini=0x4000d2fc <_dl_fini>, stack_end=0xbffff37c)
 |    at ../sysdeps/generic/libc-start.c:129

freya/src/fsearch.cgi.cc の main() の中から呼ばれている、String.ccの中の
sout_flush() から呼んでいる、sout.get() で死んでいるようです。
ここは、stringstream にためこんだ出力を、stdout に吐き出しているところ
です。

そういえば、Gcc3 からは strstream が無くなった?ので、stringstream に
置き換えたのですが、Gcc2.9 はその移行期で、実装が不安定だったようです。
実際、オリジナルFreya (Gcc2) から FreyaSX (Gcc3) への移植は MacOSX 上の
Gcc3 で行ったのですが、移植後の版を RedHat7.1 の Gcc2.96-81 で試したら
動作せず、適当に回避した記憶があります。
String.cc の 94 行目にある、
  if(sout.tellp() <= 0){ // stringstream seems be implemented incompletely
というのがそれです。stringstream の tellp() がちゃんと実装されているか
どうかで、stringstream の実装状態を占うものですが、その後の2.96の過程で、
tellp() が治ったけれどget() がまだおかしい、と言う段階があるのかも知れ
ません。ですので、この行を、
  if(1){
のように置き換えれば、問題を回避できるかも知れません。


そもそも、strstream/stringstream を使う必要があるのか、についても疑問は
あります。cout << variable << constant << flush ... みたいに書けるため
ちょっと見にカッコ良く、出力がファイルかメモリでも同一コードで対応できる
のが魅力ではあるのですが、出力フォーマットとアルゴリズムが不可分になって
しまう面ではいかがなものかと思います。自分としては、言語仕様としての
C++にはほとんど魅力を感じていないので、FreyaSX も、C++ で記述した部分は
縮小していくことになると思います。

                   D G  
┌─┐┬┌──┬┐ //\^^ ( - ); {Do the more with the less -- B. Fuller}
├─┤│└─┐│ / 877m\_<   >_ <URL:http://www.delegate.org/delegate/>
┴ └┴──┘┴──────────────────────────────
佐藤豊@情報技術研究部門.産業技術総合研究所(独立行政法人)

  admin search upper oldest olders older1 this newer1 newers latest
[Top/Up] [oldest] - [Older+chunk] - [Newer+chunk] - [newest + Check]
@_@V