トップ «前の日記(2004-09-14 (Tue)) 最新 次の日記(2004-09-18 (Sat))» 編集   RSS 1.0 FEED  

Journal InTime


2004-09-15 (Wed) [長年日記]

_ mod_rubyがささる

ruby_1_8ブランチのHEAD + Apache 2.0.50 + mod_ruby svn headの 組み合わせで、ささることがあるようだ。 gdbをアタッチしてbtしてみるも、よくわからず。 条件も特定できない。

(gdb) bt  
#0  0x403d0670 in mallopt () from /lib/tls/libc.so.6
#1  0x00000038 in ?? ()
#2  0x404938a8 in __after_morecore_hook () from /lib/tls/libc.so.6
...
#27 0x40714278 in __JCR_LIST__ () from /usr/local/lib/libruby1.8.2.so.1.8
#28 0x00000000 in ?? ()
#29 0x00009344 in ?? ()
#30 0xbfff6818 in ?? ()
#31 0x4069f347 in ruby_xmalloc (size=120) at gc.c:116

明日、まつもとさんに相談してみよう。

boronもこいつのせいかなあ。

追記:

以下のようなスクリプトでSEGVした。

#!/usr/bin/ruby -Ksd

require "webrick/cgi"
require "search/namazu"

class MyCGI < WEBrick::CGI
  def do_GET(req, res)
    100.times {
      result = Search::Namazu.search("ruby", ["/home/shugo/tmp/index"])
    }
    ary = []
    10000.times {
      ary.push(Object.new)
    }
    res["content-type"] = "text/plain"
    res.body = "hello"
  end
end

cgi = MyCGI.new
cgi.start

今度はまともなバックトレースが取れた。

(gdb) bt
#0  0x403c1741 in st_free_table (table=0x82024b8) at st.c:219
#1  0x40371f60 in obj_free (obj=1079314672) at gc.c:1153
#2  0x40371a39 in gc_sweep () at gc.c:1021
#3  0x40372479 in rb_gc () at gc.c:1387
#4  0x40370daa in rb_newobj () at gc.c:376
#5  0x403739d6 in hash_alloc (klass=1078233508) at hash.c:183
#6  0x40373a64 in rb_hash_new () at hash.c:195
#7  0x4056007e in result_make_fields (idxid=0, docid=75, field_list=1078070448)
    at namazu.c:373
#8  0x405601e3 in result_make_hlist (hlist=0xbfff9e68, fields=1078070448)
    at namazu.c:394
#9  0x405604ea in search_main (search_0=1078070428) at namazu.c:480
#10 0x4035b904 in rb_ensure (b_proc=0x405603a0 <search_main>, data1=3221200480,
    e_proc=0x40560610 <search_ensure>, data2=3221200480) at eval.c:5184
#11 0x405606aa in namazu_f_search (argc=1836017711, argv=0x6d6f682f,
    self=1079103052) at namazu.c:502

どうも、Search::Namazu.searchの中でGCが起きた時に落ちてるっぽい。

(gdb) list
214         int i;
215
216         for(i = 0; i < table->num_bins; i++) {
217             ptr = table->bins[i];
218             while (ptr != 0) {
219                 next = ptr->next;
220                 free(ptr);
221                 ptr = next;
222             }
223         }
(gdb) p ptr
$10 = (st_table_entry *) 0x6d6f682f
(gdb) p *ptr
Cannot access memory at address 0x6d6f682f

ptrの値がおかしいようだ。 さて、だれが悪いのだろう。

Tags: mod_ruby Ruby
本日のツッコミ(全2件) [ツッコミを入れる]
_ まつもと (2004-09-16 (Thu) 02:14)

デバッガであちこちのぞいて見ないと何ともいえませんね。<br>GCのバグか拡張ライブラリのバグかどちらかでしょう。<br>個人的には後者を希望。

_ shugo (2004-09-16 (Thu) 12:43)

私も後者を期待(失礼)してるんですが...。<br>(Debian的に)