From: shugo@... (MAEDA Shugo) Date: 1997-10-01T18:35:12+09:00 Subject: [ruby-dev:622] Java & GC 前田です。 Javaモジュールを使っていてついにGC周りで落ちてしまいました:-( どうもAWTを使っていてイベント処理の部分でrubyのメソッドをコール した時にGCが起きると落ちてしまうようです。 バックトレースは以下のようになっていました。 Program received signal SIGSEGV, Segmentation fault. mark_locations_array (x=0x414dd274, n=531401261) at gc.c:293 293 if (looks_pointerp(*x)) { (gdb) bt #0 mark_locations_array (x=0x414dd274, n=531401261) at gc.c:293 #1 0x8067bc1 in gc_mark_locations (start=0xbffffb28, end=0x414dd274) at gc.c:313 #2 0x806860d in gc () at gc.c:738 #3 0x8067a95 in rb_newobj () at gc.c:243 #4 0x8060fd5 in rb_call (class=0x40322aa8, recv=1077029404, mid=8145, argc=0, argv=0x0, scope=2) at eval.c:2995 #5 0x805e1b0 in rb_eval (self=1077029404, node=0x4033c2f0) at eval.c:1606 #6 0x805fd7d in rb_yield_0 (val=1076985984, self=1077029404) at eval.c:2410 #7 0x805fe5e in rb_yield (val=1076985984) at eval.c:2446 #8 0x8063175 in proc_call (proc=1077014524, args=1076985984) at eval.c:4167 #9 0x8060bc2 in rb_call (class=0x4033e58c, recv=1077014524, mid=7457, argc=1, argv=0x414dd670, scope=0) at eval.c:2891 #10 0x805e1b0 in rb_eval (self=1077014744, node=0x40320618) at eval.c:1606 #11 0x805d37c in rb_eval (self=1077014744, node=0x4032058c) at eval.c:1264 #12 0x8061279 in rb_call (class=0x4031f128, recv=1077014744, mid=8561, argc=0, argv=0x414ddaa4, scope=1) at eval.c:3072 #13 0x80614e6 in f_send (argc=2, argv=0x414dda9c, recv=1077014744) at eval.c:3149 #14 0x8060be6 in rb_call (class=0x40348c94, recv=1077014744, mid=3481, argc=2, argv=0x414dda9c, scope=1) at eval.c:2894 #15 0x806155d in rb_funcall (recv=1077014744, mid=3481, n=2, __builtin_va_alist=17123) at eval.c:3182 #16 0x8055d9c in jri_RubyObject_callMethod0 (env=0x414dde3c, obj=0x1, id=1077014744, method_name=0x2, arg=0x3) at java.c:2262 #17 0x40197613 in push_env () #18 0x4016586e in invokeJNINativeMethod () at ../../../../src/share/java/runtime/classruntime.c:505 #19 0x40199e12 in invq_not_inm5 () #20 0x40741920 in ?? () #21 0x8476060 in ?? () #22 0x40740240 in ?? () #23 0x4031f128 in ?? () Cannot access memory at address 0x201. /* jri.RubyObjectのnative method */ void jri_RubyObject_callMethod0(JNIEnv *env, jobject obj, jint id, jstring method_name, jobject arg) { VALUE self = (VALUE) id; ID mid; char name[512]; const char *tmp; gc_s_disable(); tmp = (*env)->GetStringUTFChars(env, method_name, 0); strcpy(name, tmp); (*env)->ReleaseStringUTFChars(env, method_name, tmp); mid = rb_intern(name); if (rb_respond_to(self, mid)) rb_funcall(self, rb_intern("send"), 2, INT2NUM(mid), jobject_new(env, arg)); gc_s_enable(); } とりあえずJavaからrubyを呼ぶ部分でこのようにGCしないよう にしてみたのですが、今度は test.rb:41:in `print': fatal: stack level too deep from test.rb:41:in `countup' from test.rb:23:in `initialize' from test.rb:22:in `call' from /home/shugo/ruby/java/event/adjustment.rb:17:in `adjustmentValueChanged' from test.rb:41:in `send' from test.rb:41:in `sleep' from test.rb:41:in `mainloop' from test.rb:46 のように500回くらいイベントが呼ばれたところでstack level too deep となってしまいました。 なぜstack level too deepなのかわからないのですが、やはりスレッド がらみの問題なのでしょうか。 -- 前田 修吾