Kouhei Sutou
kou****@cozmi*****
2008年 9月 9日 (火) 13:22:28 JST
須藤です。 2008/09/09 12:13 Noritada Kobayashi <norit****@gmail*****>: > 起動時に~/.kazehakase/clip.xmlがあるとRuby関連のsegfaultが起きる、 > というバグで、バックトレースも同バグのバグ報告に収められています。 clip.xmlは単にGCのタイミングに関連しているだけかと思います。 例えば、こうすると、clip.xmlがあってももう少し先に進みそうな気がします。 Index: data/ext/ruby/kazehakase-init-pre.rb =================================================================== --- data/ext/ruby/kazehakase-init-pre.rb (リビジョン 3511) +++ data/ext/ruby/kazehakase-init-pre.rb (作業コピー) @@ -46,6 +46,7 @@ end begin + GC.disable require 'gtk2' GLib::Log.cancel_handler ENABLE = true @@ -60,5 +61,7 @@ rescue Exception ENABLE = false print_warning(Kz.gettext("Ruby extension disabled: failed require 'gtk2'")) + ensure + GC.enable end end 根本的な解決ではないですが。。。 バックトレースをみると、 #4 0xb6dff787 in str_alloc (klass=3067261960) at string.c:67 #5 0xb6dff80c in str_new (klass=8, ptr=0x81141f8 ":", len=1) at string.c:89 となっていて、ソースをみるとstr_new()のklassはそのままstr_alloc()の klassとして渡されるだけなのに大きく値が違っているので、もっと別の 場所で何かが壊れているのだと思います。 それは別として、Rubyのend_procsたちは初期化されていてもよさそう な気がします。そうすれば #1 0xb6d8ad2b in rb_mark_end_proc () at eval.c:7989 の中でwhile (link)でループに入ることもなく、gc_mark()も呼ばれないよ うな気もします。 ということでRubyにこのパッチを当てると挙動は変わりますか? --- eval.c.orig 2008-09-09 13:10:59.000000000 +0900 +++ eval.c 2008-09-09 13:12:21.000000000 +0900 @@ -7960,7 +7960,7 @@ struct end_proc_data *next; }; -static struct end_proc_data *end_procs, *ephemeral_end_procs, *tmp_end_procs; +static struct end_proc_data *end_procs = 0, *ephemeral_end_procs = 0, *tmp_end_procs; void rb_set_end_proc(func, data) 風博士側でend_procsを初期化しなければいけないのかもしれないの ですが、そこまではまだ見ていません。