岩岡です。

In message <199812110632.PAA14588 / picachu.netlab.co.jp>
	matz / netlab.co.jp (Yukihiro Matsumoto) writes:
> というエラーを見るとあるはずのファイル名がありません.という
> ことはf_require()に渡ったはずの socket という文字列が消えて
> なくなっているのでしょう.

gdb でちょっと追ってみました。

Breakpoint 2, load (file=0xef600
"/usr/local/lib/ruby/i386-bsdi3.1/socket.o")
    at dln.c:1038
1038        if (dln_init_p == 0) {
(gdb) print file
$4 = 0xef600 "/usr/local/lib/ruby/i386-bsdi3.1/socket.o"
(gdb) step
1039            if (dln_init(dln_argv0) == -1) return -1;
(gdb) next
1041        result = strlen(file);
(gdb) print file
$5 = 0xef600 ""

というように、load() が呼ばれた時点では file に正しいパス名が入っ
ているにもかかわらず、dln_init(dln_argv0) が呼ばれると空になってし
まうようです。

1039行目から step で追ってみると、どうやらガベコレが呼ばれているよ
うなので、もしかしてコレクションされちゃってる?

> gdbとかでf_require()の動きをトレースすれば一発で分かると思う
> のですが….スクリプトの長さで変化するという現象を見るとメモ
> リ関係だと思うのですが.alloca()がちゃんと動いてないのかなあ.

これを読んで、昔データが大きい時にうまく動かなくて GNU malloc lib
をリンクしてたのを思い出したのですが、今回は解決策になりませんでし
た;.;

中途半端ですが、とりあえずこのあたりで。

いわおか@実はちょっと訳あって自分の環境はFreeBSDに移行中