PySide 关机时出现段错误
PySide Segfault on Shutdown
所以当我的 python qt 应用程序关闭时,我得到了堆栈跟踪。当 *iter 被解除引用时它会崩溃。这是来自 pyside basewrapper.cpp
的片段
static void decRefPyObjectList(const std::list<PyObject*>& lst, PyObject *skip)
{
std::list<PyObject*>::const_iterator iter = lst.begin();
while(iter != lst.end()) {
if (*iter != skip) // causes segfault
Py_DECREF(*iter);
++iter;
}
}
来自回溯:
#0 0x00007f6ea2c22653 in Shiboken::decRefPyObjectList (lst=, skip=0x0) at debug/shiboken-1.2.2/libshiboken/basewrapper.cpp:595
#1 0x00007f6ea2c24e44 in Shiboken::Object::clearReferences (self=0x7f6e7260c908) at debug/shiboken-1.2.2/libshiboken/basewrapper.cpp:1361
#2 0x00007f6ea2c23f86 in Shiboken::Object::destroy (self=0x7f6e7260c908, cppData=0x7f6e540f1220) at debug/shiboken-1.2.2/libshiboken/basewrapper.cpp:1127
#3 0x00007f6ea0f29d4f in QDataWidgetMapperWrapper::~QDataWidgetMapperWrapper (this=0x7f6e540f1220, __in_chrg=<optimized out>) at debug/pyside-qt4.8+1.2.2/build/PySide/QtGui/PySide/QtGui/qdatawidgetmapper_wrapper.cpp:309
关于什么情况可能导致这种情况的任何提示?通过查看堆栈跟踪,它发生在 QT/PySide 拆除期间。当它去清理所有对象引用时。
事实证明,Python 垃圾收集器正在抓取引用,然后 PySide 试图清理相同的引用。
解决方案是在 python 中显式保存对所述对象的引用。在我们的例子中,它是我们附加到 QT 的模型。
在一个 class 子class 内的 QDataWidgetMapper。这打破了,模型是罪犯,它没有存储在映射器之外,这意味着它是 GC 拾取的松散引用:
def setModel(self, model):
QDataWidgetMapper.setModel(self, model)
更改为:
def setModel(self, model):
self._model = model
QDataWidgetMapper.setModel(self, model)
现在我们正在显式存储对模型的引用,它不会被垃圾收集并且 PySide 可以清理它。
所以当我的 python qt 应用程序关闭时,我得到了堆栈跟踪。当 *iter 被解除引用时它会崩溃。这是来自 pyside basewrapper.cpp
的片段static void decRefPyObjectList(const std::list<PyObject*>& lst, PyObject *skip)
{
std::list<PyObject*>::const_iterator iter = lst.begin();
while(iter != lst.end()) {
if (*iter != skip) // causes segfault
Py_DECREF(*iter);
++iter;
}
}
来自回溯:
#0 0x00007f6ea2c22653 in Shiboken::decRefPyObjectList (lst=, skip=0x0) at debug/shiboken-1.2.2/libshiboken/basewrapper.cpp:595
#1 0x00007f6ea2c24e44 in Shiboken::Object::clearReferences (self=0x7f6e7260c908) at debug/shiboken-1.2.2/libshiboken/basewrapper.cpp:1361
#2 0x00007f6ea2c23f86 in Shiboken::Object::destroy (self=0x7f6e7260c908, cppData=0x7f6e540f1220) at debug/shiboken-1.2.2/libshiboken/basewrapper.cpp:1127
#3 0x00007f6ea0f29d4f in QDataWidgetMapperWrapper::~QDataWidgetMapperWrapper (this=0x7f6e540f1220, __in_chrg=<optimized out>) at debug/pyside-qt4.8+1.2.2/build/PySide/QtGui/PySide/QtGui/qdatawidgetmapper_wrapper.cpp:309
关于什么情况可能导致这种情况的任何提示?通过查看堆栈跟踪,它发生在 QT/PySide 拆除期间。当它去清理所有对象引用时。
事实证明,Python 垃圾收集器正在抓取引用,然后 PySide 试图清理相同的引用。
解决方案是在 python 中显式保存对所述对象的引用。在我们的例子中,它是我们附加到 QT 的模型。
在一个 class 子class 内的 QDataWidgetMapper。这打破了,模型是罪犯,它没有存储在映射器之外,这意味着它是 GC 拾取的松散引用:
def setModel(self, model):
QDataWidgetMapper.setModel(self, model)
更改为:
def setModel(self, model):
self._model = model
QDataWidgetMapper.setModel(self, model)
现在我们正在显式存储对模型的引用,它不会被垃圾收集并且 PySide 可以清理它。