gc assertion failure

Todd Miller jmiller at stsci.edu
Wed Oct 29 15:50:00 EST 2003


Tim Peters wrote:
> [Todd Miller]
> 
>>I recently discovered an assertion failure in the Python garbage
>>collection system when scripts using our C extension (numarray) exit.
>>The assertion is activated for Pythons configured using
>>  --with-pydebug. I have a feeling I may be doing something wrong
>>with garbage collection support for some of our c types,  but I'm not
>>sure exactly what.
>>
>>Here is the assertion output:
>>
>>python: Modules/gcmodule.c:231: visit_decref: Assertion
>>`gc->gc.gc_refs != 0' failed.
>>Abort (core dumped)
> 
> 
> Looking at the source code should clarify:
> 
> 	assert(gc->gc.gc_refs != 0); /* else refcount was too small */
> 
> That is, gc found more pointers to an object than that object's refcount
> believes exists.  A missing Py_INCREF or an extra Py_DECREF are plausible
> causes; so is a bad tp_traverse function that passes a single containee
> multiple times (although I've only see that once in real life).  A missing
> Py_INCREF is (IME) the most common cause for this assertion.
> 
> 
>>...
>>#5  0x080e9222 in visit_decref (op=0x405adc74, data=0x0) at
>>Modules/gcmodule.c:231
>>#6  0x0808cebf in tupletraverse (o=0x40a62f74, visit=0x80e9194
>><visit_decref>, arg=0x0) at Objects/tupleobject.c:398
> 
> 
> So it's complaing about an object that happens to be in a tuple.  Displaying
> more info about op would tell you more about the kind of object it's
> complaining about.
> 

Thanks Tim!  It turns out to be one of the objects numarray uses to 
represent data type, Int64.   I also noticed that the problem goes away 
when I switch on the "Python prototype" for some C code,  which is 
further evidence that the problem is a ref count error since the code in 
question just touches type objects,  it doesn't implement them.

I haven't found the bug yet,  but I'm out of wheel lock.  Definitely 
makes my day...

Thanks again,
Todd









More information about the Python-list mailing list