[PyQt] segfault using daily snapshot
Erik Janssens
Erik.Janssens at conceptive.be
Sat Dec 18 10:40:07 GMT 2010
Hello Phil
Thank you for your assistance. Yes, threads are involved
in my tests. The segfault for sure happens during a
'deconstruction' phase, most of the time this is at the
end of the tests, but not always.
I don't think there is any recursive behavior involved,
our stress tests consist of generating a huge number of
Camelot form and table views one after another.
I tried to change the code as you suggested to :
static void clear_access_func(sipSimpleWrapper *sw)
{
sipAccessFunc old_access_func;
old_access_func = NULL;
if (sw->access_func != NULL)
{
old_access_func = sw->access_func;
sw->access_func = NULL;
}
if (old_access_func != NULL)
{
old_access_func(sw, ReleaseGuard);
}
sw->data = NULL;
}
maybe a bit too much code, but I wanted to be sure.
but it didn't help, still the same effect, I also tried
to put a SIP_BLOCK_THREADS around the code block, but it
didn't help either.
would it be possible that a single QObject has multiple
python wrappers, resulting in duplicate deletes ?
what is for sure is that when I comment out the ReleaseGuard
function, there are no segfaults.
what is the purpose of the ReleaseGuard step ? I don't find
any docs on it in the qt docs.
Maybe I should give a bit more background on the issue. We
have observed a number of segfaults with users of our application.
What is strange is that this number is far higher with
Windows 7 users. Also, on Windows 7 the crashes seem more
severe (push-the-button-time). As this is the only segfault
I'm able to produce with testing, I suspect it's this issue
causing the Windows 7 segfaults, but that's not sure of course.
What I could do is deploy a number of apps with the ReleaseGuard
line removed, to confirm this is the issue, but then I'd like
to understand what the line is about ?
Another option would be to deploy debug-builds on Windows, but
I'm really unfamiliar with doing such thing so I'd like to
avoid it.
Regards,
Erik
On Fri, 2010-12-17 at 18:47 +0000, Phil Thompson wrote:
> On Fri, 17 Dec 2010 09:17:14 +0100, Erik Janssens
> <Erik.Janssens at conceptive.be> wrote:
> > Hello Phil,
> >
> > please find enclosed a stack trace with a debug build
> > of the last qt / pyqt releases.
> >
> > apart from my stress-tests, I did not yet found an
> > easy way to reproduce it. but I'm quite sure it affects
> > our users as well during their daily use.
> >
> > I do have a 60Mb core dump of it, but the whole debug
> > build is more than 700Mb.
> >
> > Should you have any hints for me on how to investigate
> > this further...
>
> Nothing looks obviously wrong.
>
> Are threads involved in your tests?
>
> Does the crash happen during normal execution, or only when the
> interpreter terminates?
>
> SIP gets the address of a C++ instance via an access function. PyQt
> supplies qpointer_access_func() which uses a QPointer<QObject> so that it
> can detect when a QObject created internally by Qt gets deleted. (PyQt can
> detect when a QObject created by PyQt gets deleted by another mechanism.)
> The crash is happening when the resources used to implement the QPointer
> are being released when the Python object wrapping the C++ QObject is being
> garbage collected.
>
> I will assume for the moment that QPointer works properly - although I'm
> not totally convinced as there seems to be a race condition in
> QMetaObject::removeGuard().
>
> Looking at the implementation of clear_access_func() in siplib.c you can
> see that it tries to make sure that the resources are not freed twice by
> resetting the the pointer to the access function.
>
> Unless there is something fairly obvious that I am missing (which is quite
> possible) I would start to suspect timing issues - although the stack trace
> doesn't suggest any recursive behaviour.
>
> You might want to try changing clear_access_func() so that it saves the
> value of sw->access_func, clears it, then calls the access function using
> the saved pointer.
>
> Phil
More information about the PyQt
mailing list