Kouhei Sutou
kou****@clear*****
2009年 7月 1日 (水) 23:42:57 JST
須藤です。 In <a3699****@mail*****> "[groonga-dev,00102] Re: Ruby/groongaにてDatabaseをopenするとSegmentation faultする" on Wed, 1 Jul 2009 00:26:15 +0900, SHIDARA Yoji <daras****@gmail*****> wrote: >> groongaを-O0 -gでビルドして、gdbでバックトレースをとってもらっ >> てもよいですか? > > 手順の通りやってみました。結果は以下の通りです。(Ubuntu 9.04) ありがとうございます。 > dara @ mint:~/tmp$ gdb --args ruby -rgroonga -e "Groonga::Database.open('testdb')" ... > Program received signal SIGSEGV, Segmentation fault. > [Switching to Thread 0x7f013d5cb6f0 (LWP 18544)] > 0x00007f013bfa1dd5 in grn_tiny_array_at (a=0x68, id=1014827616) at hash.c:59 > 59 GRN_TINY_ARRAY_AT(a, id, e); > (gdb) bt > #0 0x00007f013bfa1dd5 in grn_tiny_array_at (a=0x68, id=1014827616) at hash.c:59 > #1 0x00007f013bfc8d0c in grn_obj_delete_by_id (ctx=0x26a0800, db=0x0, > id=1014827616, removep=0) > at db.c:3573 > #2 0x00007f013bfca3df in grn_obj_close (ctx=0x26a0800, obj=0x26a0950) > at db.c:3803 > #3 0x00007f013c2588c5 in rb_grn_object_unbind (rb_grn_object=0x26e9c60) > at /home/dara/local/src/ruby-groonga/ext/rb-grn-object.c:98 > #4 0x00007f013c258157 in rb_grn_object_free (object=0x68) > at /home/dara/local/src/ruby-groonga/ext/rb-grn-object.c:113 0x68なので、この時点でオブジェクトが壊れていますね。 でも、#3ではそれっぽいアドレスになっているなぁ。なんでだろう。 > #5 0x00007f013d1046f6 in rb_gc_call_finalizer_at_exit () from > /usr/lib/libruby1.8.so.1.8 あぁ、終了時のGCですか。。。 根本的な解決ではないのですが、groongaにこんなパッチを当てる と落ちなくなったりしませんか? diff --git a/lib/db.c b/lib/db.c index 91cd293..f85981d 100644 --- a/lib/db.c +++ b/lib/db.c @@ -3800,7 +3800,9 @@ grn_obj_close(grn_ctx *ctx, grn_obj *obj) for (entry = 0; entry < N_HOOK_ENTRIES; entry++) { grn_hook_free(ctx, DB_OBJ(obj)->hooks[entry]); } - grn_obj_delete_by_id(ctx, DB_OBJ(obj)->db, DB_OBJ(obj)->id, 0); + if (DB_OBJ(obj)->db) { + grn_obj_delete_by_id(ctx, DB_OBJ(obj)->db, DB_OBJ(obj)->id, 0); + } } switch (obj->header.type) { case GRN_VECTOR : -- 須藤 功平 <kou****@clear*****> 株式会社クリアコード (http://www.clear-code.com/)