[groonga-dev,00104] Re: Ruby/groongaにてDatabaseをopenするとSegmentation faultする

Back to archive index

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/)




groonga-dev メーリングリストの案内
Back to archive index