[Kazehakase-devel 2905] Re: 起動時に~/.kazehakase/clip.xmlがある場合にsegfault

Back to archive index

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を初期化しなければいけないのかもしれないの
ですが、そこまではまだ見ていません。




Kazehakase-devel メーリングリストの案内
Back to archive index