Python:分段错误(核心已转储)

3
我用 PySide 库用 Python 写了一个 Qt 应用程序。当我关闭它时,会出现“分段错误 (core dumped)”的错误提示。
使用 gdb 进行回溯:
(gdb) backtrace 
#0  0x00007ffff5d19c40 in QObject::staticMetaObject () from /usr/lib/x86_64-linux-gnu/libQtCore.so.4
#1  0x00007ffff64c4bce in PySide::SignalManager::clear() () from /usr/lib/x86_64-linux-gnu/libpyside-python2.7.so.1.2
#2  0x00007ffff64d1f95 in PySide::destroyQCoreApplication() () from /usr/lib/x86_64-linux-gnu/libpyside-python2.7.so.1.2
#3  0x00007ffff64d2981 in PySide::runCleanupFunctions() () from /usr/lib/x86_64-linux-gnu/libpyside-python2.7.so.1.2
#4  0x00007ffff683ecc5 in ?? () from /usr/lib/python2.7/dist-packages/PySide/QtCore.so
#5  0x000000000052f936 in PyEval_EvalFrameEx ()
#6  0x000000000056d0aa in ?? ()
#7  0x00000000004da29f in PyEval_CallObjectWithKeywords ()
#8  0x000000000042fa19 in Py_Finalize ()
#9  0x000000000042fb7c in Py_Exit ()
#10 0x000000000042fcb9 in ?? ()
#11 0x000000000042ec32 in PyErr_PrintEx ()
#12 0x000000000042f042 in ?? ()
#13 0x000000000046aa09 in Py_Main ()
#14 0x00007ffff7817ec5 in __libc_start_main (main=0x46ac3f <main>, argc=2, argv=0x7fffffffdf58, init=<optimized out>, fini=<optimized out>, 
    rtld_fini=<optimized out>, stack_end=0x7fffffffdf48) at libc-start.c:287
#15 0x000000000057497e in _start ()

版本:

QMake version 3.0
Using Qt version 5.2.1 in /usr/lib/x86_64-linux-gnu
Python 2.7.6
Ubuntu 14.04

我该怎么解决这个问题?

你使用了Qt中不允许的操作。请展示你的代码! - Daniel
@Daniel,我不能展示我的代码。有没有一种方法可以使用gdb或其他工具获取错误行? - Patrick
1
尝试简化你的代码,直到错误消失。 - Daniel
错误几乎肯定发生在核心转储发生的代码的其他位置。核心转储发生在一个高度使用的库代码中。最有可能的解释是,在您的代码的其他地方,您已经对Qt对象进行了操作,并将其留在不一致的状态下,但只有当Qt尝试清理时才会暴露错误。 - Dunes
1个回答

1
如果这个问题仍然是最新的,我遇到了同样的问题,并在今天解决了它。在我的情况下,问题出在调用

上。
destroy()

直接调用我的小部件的方法。由于我有一些线程未关闭,导致出现段错误。根据我现在的阅读,更好的做法是发出关闭事件。我现在也覆盖了closeEvt()方法,并在那里检查是否有要在关闭应用程序之前完成的工作。
##
#  Closes the application
#  ...
def closeEvent(self, event):
    if self.canClose() # Exit the application
        event.accept() 
        logging.debug("Closed App clean")
    else:
        # Do stuff to close the application cleanly
        if canCloseNow:
            event.accept()
        else: 
            # Give user feedbackstuff like opening a save dialog 
            # or some other stuff...
            event.ignore()

我知道可能有更优雅的方法来完成这个任务,但对我而言这种方法也非常有效...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接