From: Masahiro S. ()
<sa...@to...> - 2003-08-04 17:51:11
|
さかいです。 From: Masao Mutoh <mu...@hi...> Subject: Re: [ruby-gnome2-devel-ja] segfault Date: Sun, 3 Aug 2003 02:46:22 +0900 > むとうです。 > > 中間報告です。 > > On Fri, 1 Aug 2003 22:46:12 +0900 > Masao Mutoh <mu...@hi...> wrote: > > > 上記では落ちなくなったのですが、最新のrbbrだと落ちます....。 > > 特定のメソッドが原因のような気もしてますのでちと追ってみます。 > > > > それでは。 > > たぶん、以下のスクリプトで再現すると思います。 > > HashをStringに変えると起きません。 > > gdbのbtの状況とHashが引っかかったところを見ると、 > boxed_ruby_*周りが怪しいかなと思っています。 うーん。 手元の環境だと何故か再現しないんです。なんでだろ… * ruby 1.8.0 (2003-08-02) [i386-cygwin] * glib-2.2.2 gtk+-2.2.2 Linuxマシンにも久しぶりにgtk2入れようかなぁ。 > backtraceの結果 > > Program received signal SIGSEGV, Segmentation fault. > [Switching to Thread 1074295968 (LWP 11359)] > 0x0805900f in rb_longjmp (tag=6, mesg=1084405584) at eval.c:3923 > 3923 JUMP_TAG(tag); > (gdb) bt > #0 0x0805900f in rb_longjmp (tag=6, mesg=1084405584) at eval.c:3923 > #1 0x08059084 in rb_exc_raise (mesg=1084405584) at eval.c:3930 > #2 0x080ba5f7 in rb_raise (exc=1074484448, > fmt=0x80d54a0 "wrong argument type %s (expected %s)") at error.c:694 > #3 0x080b983a in rb_check_type (x=0, t=-1073756272) at error.c:254 > #4 0x4002720d in boxed_ruby_value_unref (val=0) at rbgobj_valuetypes.c:170 むむ? valが0=QfalseということはSPECIAL_CONST_P(val)が真になって、 170行目のData_Get_Structに到達しないはずなのに…… しかもrb_check_typeの第二引数がT_DATA=0x22でないのも何か変です。 162: static void 163: boxed_ruby_value_unref(VALUE val) 164: { 165: if (!SPECIAL_CONST_P(val)){ 166: VALUE key = rb_obj_id(val); 167: VALUE marker = rb_hash_aref(boxed_ruby_value_markers, key); 168: boxed_ruby_value_counter* counter; 169: 170: Data_Get_Struct(marker, boxed_ruby_value_counter, counter); 171: counter->ref_count -= 1; 172: 173: if (!counter->ref_count) 174: rb_funcall(boxed_ruby_value_markers, id_delete, 1, key); 175: } 176: } > #5 0x400de2d0 in g_boxed_free (boxed_type=135957332, boxed=0x40a2ba0c) > at gboxed.c:409 > #6 0x40685fb4 in _gtk_tree_data_list_free () from /usr/lib/libgtk-x11-2.0.so.0 > #7 0x40135148 in g_slist_foreach (list=0x0, > func=0x40685ef0 <_gtk_tree_data_list_free>, user_data=0x8116188) > at gslist.c:630 > #8 0x405d3d76 in gtk_list_store_set_column_types () > from /usr/lib/libgtk-x11-2.0.so.0 > #9 0x400e1409 in g_object_last_unref (object=0x401058e8) at gobject.c:442 > #10 0x40022462 in rbgobj_free (holder=0x81b8728) at rbgobject.c:134 > #11 0x0806b0d3 in rb_gc_call_finalizer_at_exit () at gc.c:1607 > #12 0x080534c1 in ruby_finalize_0 (exp=0xbfffed30) at eval.c:1333 > #13 0x08053622 in ruby_cleanup (ex=0) at eval.c:1368 多分、終了時のGCではrb_global_variableした変数といえど保護されないため、 boxed_ruby_value_markersが既に破棄されてしまっているのが原因でしょう。 RubyのHashではなくst.hかGHashTableを使うように変更しようと思います。 -- 酒井 政裕 / Masahiro Sakai |