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


#1

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.

#2

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;
    }


#3

On 2/20/06, Ross B. removed_email_address@domain.invalid 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.


#4

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