python:分段错误(核心转储)

时间:2014-12-31 12:56:32

标签: python qt segmentation-fault

我使用PySide库在python中编写了一个Qt应用程序。当我关闭它时,我得到分段错误(核心转储)

使用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

我如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

如果这个问题仍然是最新的,我有同样的问题,今天就解决了。 在我的情况下,通过调用

是一个问题
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()

我知道很可能有更优雅的程序来做到这一点,但对我来说它运作得很好......