Forum: Ruby GC Bug? Ruby 1.8.4 core dumps on a very small extension

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
59267aa13a32408ad6e114ca9f3b897f?d=identicon&s=25 Danie Roux (Guest)
on 2006-02-19 23:48
(Received via mailing list)
Hi all,

Long (and tiring) story short:

I have an extension that is 40 lines* in total, the C code and Ruby
code that exercise it. It core dumps, while I repeatedly call a method
that just returns Qtrue.

All it really does is:

rb_iv_set(self, "@v", 100);

in initialize. If I change that 100 to 99, it doesn't core dump.
Change it back to 100, it core dumps within a few seconds.

Further, the while loop that executes it looks like this:

while true
    print ''
    b.buzz
end

If I take out the print statement, it keeps on running. Put back the
print statement, and it core dumps.

This is a self-compiled 1.8.4 on Ubuntu i386. A friend confirms that
the same thing happens to him on Gentoo with 1.8.4.

I am attaching the code, hopefully its going to come through.

* It was around 600, and use to core dump every 8 hours or so.
Snipping it down to these 40 lines was pure blind luck, and many 8
hour turnaround iterations.
A9b6a93b860020caf9d2d1d58c32478f?d=identicon&s=25 Ross Bamford (Guest)
on 2006-02-20 00:06
(Received via mailing list)
On Mon, 2006-02-20 at 07:47 +0900, Danie Roux wrote:
> Hi all,
>
> Long (and tiring) story short:
>
> I have an extension that is 40 lines* in total, the C code and Ruby
> code that exercise it. It core dumps, while I repeatedly call a method
> that just returns Qtrue.

Please try making this change:

--- buzz-orig.c 2006-02-19 23:01:22.000000000 +0000
+++ buzz.c      2006-02-19 23:01:56.000000000 +0000
@@ -8,7 +8,7 @@

 static VALUE initialize(VALUE self)
 {
-    rb_iv_set(self, "@v", 100);
+    rb_iv_set(self, "@v", INT2FIX(100));

     return self;
 }
59267aa13a32408ad6e114ca9f3b897f?d=identicon&s=25 Danie Roux (Guest)
on 2006-02-21 17:56
(Received via mailing list)
On 2/20/06, Ross Bamford <rossrt@roscopeco.co.uk> wrote:
> -    rb_iv_set(self, "@v", 100);
> +    rb_iv_set(self, "@v", INT2FIX(100));

Ross,

Thank you. Moral of the story: Explicitly cast any C value into a Ruby
one.

It still strikes me odd that it would run a couple of hundred
iterations before breaking, though.
4596f0fa753784a18ef8289341df5948?d=identicon&s=25 Charles Mills (Guest)
on 2006-02-21 20:35
(Received via mailing list)
Danie Roux wrote:
> > Please try making this change:
> --
> Danie Roux *shuffle* Adore Unix               http://blog.acolyte.co.za

Assuming you're using a 32bit machine.  100 % 4 == 0, so Ruby thinks
100 is a pointer to a Ruby object.  (Dereferencing 100 causes the core
dump.)  99 % 2 == 1, so 99 looks like a Fixnum to Ruby -- but not 99,
99>>1 I think.

It may take a couple hundred iterations before the GC runs.

-Charlie
This topic is locked and can not be replied to.