なひです.

> From: Shugo Maeda [mailto:shugo / netlab.co.jp]
> Sent: Monday, July 05, 1999 9:47 AM

> At Sat, 3 Jul 1999 21:29:49 +0900,
> NAKAMURA, Hiroshi <nakahiro / sarion.co.jp> wrote:
> > > なひです.mod_rubyと格闘中です.
> > > うーん,mod_rubyのdebugって,どうやりゃいいんだろう.^^;
> 
> 私は、gdbでrun -Xしてます(^_^;

やはりそれしかありませんか.ありませんよね.^^;
というわけで諦めて(?),
ApacheのStartServersとMaxClientsを1にしてgdbすることにしました.

> > Apache/1.3.3 (Unix) mod_ruby/0.1.0 Ruby/1.3.1(1999-03-11)
> > 
> > を使ってるんですが,ある程度の長さの文字列をPOSTすると,
> > mod_ruby経由で動いているスクリプトのお返事がなくなるようです.
> 
> ひょっとすると、ついこの間つぶしたバグかもしれません。
> このパッチでいかがでしょう?
> # 0.1.2へのパッチです。

素早い対応,どうもありがとうございます.

実はこれまでいじっていた
Apache/1.3.3 (Unix) mod_ruby/0.1.0 Ruby/1.3.1(1999-03-11)
というのは,jin.gr.jpというサイトで実験的に起ち上げてもらっている
Linuxサーバ環境なのでした.
勝手にPatch当てていろいろいじれる環境ではないんですが,
いいついでですから,現在ローカルに
Apache/1.3.6 + mod_ruby/0.1.2 + Ruby/1.3.4 on Solaris/2.5.1
を構築中です.

	/	/	/

まずはインストールに使うMakefile.RBのPatchです.
Solaris/2.5.1だとmkmf内のCONFIG["INSTALL_DATA"]が
"../install-sh"になってしまうので,CONFIG["conpile_dir"]を足しました.
ついでにHP-UX対策に(?),INSTALL_DLLIBを使うようにしました.
ただ,ApacheをHP-UXでインストールしてないのでよくわかりません.
HP-UX上で「〜.so」決め打ちじゃ,元々駄目かな?

INSTALL_DLLIBは,ruby-1.3.4からでしたっけ?

# というのは,後ろに居る小松さんに聞いた方が早いかも...
# ...1.3.4-990624からだそうです.^^;

	/	/	/

22a23,31
> $install = CONFIG["INSTALL_PROGRAM"]
> $install_dllib = CONFIG["INSTALL_DLLIB"]
> $install_data = CONFIG["INSTALL_DATA"]
> if $install =~ %r!^[^\s/]+/! then
>   $install = CONFIG["compile_dir"]+"/"+$install
>   $install_dllib = CONFIG["compile_dir"]+"/"+$install_dllib
>   $install_data = CONFIG["compile_dir"]+"/"+$install_data
> end
> 
34,35c43,45
< INSTALL = #{CONFIG["INSTALL"]}
< INSTALL_DATA = #{CONFIG["INSTALL_DATA"]}
---
> INSTALL = #{$install}
> INSTALL_DLLIB = #{$install_dllib}
> INSTALL_DATA = #{$install_data}
48c58
< 	$(INSTALL_DATA) $(TARGET) #{$APACHE_LIBEXECDIR}
---
> 	$(INSTALL_DLLIB) $(TARGET) #{$APACHE_LIBEXECDIR}

	/	/	/

で,このままmod_ruby.soをインストールし,
httpd.confを書き換えてApache/1.3.6を起ち上げようとすると,
libmathがリンクされてないので怒られます.
というわけで,Makefile.RBが作ったMakefileに「-lm」を追加.

# Apacheがdlopen()に失敗した時に表示される
# dlerror()を見ても,なかなか理由がわからなかった...
# 「〜: symbol log: 〜」の「log」を見落としたです.^^;

ここまででどうやら,
Apache/1.3.6 (Unix) mod_ruby/0.1.2 Ruby/1.3.4(1999-06-25)
として動かせました.(^-^)

	/	/	/

ただし,どうもあるスクリプトを最初に呼び出す時,
GET MethodでなくPOST Methodで呼び出すと,
サーバが固まってしまうようです.gdbのスタックトレースを載せます.

#0  0xef5b788c in _poll ()
#1  0xef5d3cc8 in select ()
#2  0xef1709cc in rb_thread_schedule ()
#3  0xef170c64 in rb_thread_wait_fd ()
#4  0xef17a794 in rb_io_gets ()
#5  0xef17a368 in rb_io_gets_internal ()
#6  0xef17a910 in rb_io_gets_method ()
#7  0xef16aa44 in call_cfunc ()
#8  0xef16b068 in rb_call0 ()
#9  0xef16b920 in rb_call ()
#10 0xef166824 in rb_eval ()
#11 0xef1655ac in rb_eval ()
#12 0xef165104 in rb_eval ()
#13 0xef163510 in eval_node ()
#14 0xef16cdc4 in rb_load ()
#15 0xef16d074 in rb_load_protect ()
#16 0xef1561e4 in load_ruby_script ()
#17 0xef1718fc in rb_thread_create_0 ()
#18 0xef171a60 in rb_thread_create ()
#19 0xef1565f8 in ruby_handler0 ()
#20 0xef156680 in ruby_handler ()
#21 0x1f61c in ap_invoke_handler ()
#22 0x3aae4 in process_request_internal ()
#23 0x3ab64 in ap_process_request ()
#24 0x2efe4 in child_main ()
#25 0x2f338 in make_child ()
#26 0x2f448 in startup_children ()
#27 0x2fd1c in standalone_main ()
#28 0x3088c in main ()

GET Methodにも関わらず,
rb_io_gets_methodでSTDINを読みに行っているようです.
最初の呼び出しが(運良く)POST Methodなら,
以後GETだろうがPOSTだろうが問題なく処理しつづけます.

	/	/	/

とりあえずここまでで力尽きました.
POST Methodで大量に送り付けると固まる現象については,
まだテストできてません.^^;

って,あれ,もしかすると,頂いたPatchを当てると
上記の現象も直るのかな? 今から試してみますね...