3

PySide と Python3 には難しい問題があります。メモリの問題により、プログラムがランダムにクラッシュします。未処理の例外などはスローしません。これらのエラーが原因で終了するのはインタープリターです。プログラムには 2 つのスレッドが含まれています。1 つは GUI 操作用で、2 つ目はデータベース操作用です。それらはスロット/シグナルを使用して通信し、実際には何も共有しません (データベース スレッドのタスクはディープコピーされ、その結果も同様です)。最初は、スレッド化されたパラメーターなしで cx_Oracle を使用したことが問題の原因であると考えましたが、このパラメーターを追加しても何も変わりませんでした。

gdb でインタープリターを実行すると、次の 2 つのメッセージが表示されます。

*** 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には独自のメモリ管理システムがあると読みました。それが原因である可能性はありますか?

少なくとも、私のコードで探すべきいくつかのアイデアを教えてください。

4

0 に答える 0