我对PySide和Python3有一个棘手的问题。由于内存问题,该程序随机崩溃。它不会抛出未处理的异常或任何东西,它是由于这些错误而死亡的解释器。该程序包含两个线程。一个用于GUI操作,第二个用于数据库操作。它们使用插槽/信号进行通信,并且不会真正共享任何内容(数据库线程的任务是深度复制的,因此它的结果也是如此)。起初我认为问题是由于没有使用thread参数的cx_Oracle引起的,但添加此参数后没有任何改变。
在gdb中运行解释器会给我这两条消息:
*** glibc detected *** /usr/bin/python3.2: free(): invalid pointer: 0x082a02e0 ***
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(+0x75ee2)[0xb7bfdee2]
/usr/bin/python3.2[0x807941b]
/usr/bin/python3.2(PyEval_EvalFrameEx+0x4877)[0x809c7e7]
...
/usr/bin/python3.2(PyEval_CallObjectWithKeywords+0x3e)[0x8097cce]
/usr/bin/python3.2(PyObject_CallObject+0x1f)[0x81418ef]
/usr/lib/i386-linux-gnu/libpyside.cpython-32mu.so.1.1(_ZN6PySide13SignalManager20callPythonMetaMethodERK11QMetaMethodPPvP7_objectb+0x4d)[0xb6b9901d]
/usr/lib/i386-linux-gnu/libpyside.cpython-32mu.so.1.1(_ZN6PySide13SignalManager11qt_metacallEP7QObjectN11QMetaObject4CallEiPPv+0x170)[0xb6b994a0]
...
或
Program received signal SIGSEGV, Segmentation fault.
0x08098746 in PyEval_EvalFrameEx ()
(gdb) info threads
Id Target Id Frame
2 Thread 0xb08e6b40 (LWP 14528) "python3.2" 0xb7fdd424 in __kernel_vsyscall ()
* 1 Thread 0xb7b866c0 (LWP 14527) "python3.2" 0x08098746 in PyEval_EvalFrameEx ()
(gdb) thread 2
[Switching to thread 2 (Thread 0xb08e6b40 (LWP 14528))]
#0 0xb7fdd424 in __kernel_vsyscall ()
...
#35 0x08097cce in PyEval_CallObjectWithKeywords ()
#36 0x081418ef in PyObject_CallObject ()
#37 0xb6b9901d in PySide::SignalManager::callPythonMetaMethod(QMetaMethod const&, void**, _object*, bool) () from /usr/lib/i386-linux-gnu/libpyside.cpython-32mu.so.1.1
#38 0xb6b994a0 in PySide::SignalManager::qt_metacall(QObject*, QMetaObject::Call, int, void**) () from /usr/lib/i386-linux-gnu/libpyside.cpython-32mu.so.1.1
我可以看到它总是发生在Qt库中的某个地方,但是没有办法按需重现这种崩溃。我必须运行程序,使用它一段时间然后崩溃。
由于这种行为,我真的不知道要查找什么,如何调试。我尝试在程序开头用gc.disable()
禁用垃圾收集器,但它没有改变任何东西。我读到Qt拥有自己的内存管理系统。这可能是它的错吗?
请至少给我一些在我的代码中寻找的想法。