Ich habe eine Python-Anwendung mit mehreren Threads, die PyEnchant aufruft. Ich bin kein Python-Experte und ein Großteil des Codes stammt von einem Drittanbieter. Ich habe Code hinzugefügt, um PyEnchant aus der Multithreading-Anwendung aufzurufen. Seit ich diese Änderung vorgenommen habe, läuft die Anwendung unterschiedlich lange und stürzt dann ab. Ich führe sie unter Ubuntu 12.04 aus. Ich erhalte Fehler wie diese:
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7fffc5ffd700 (LWP 6858)]
0x00007ffff4424854 in ?? () from /usr/lib/libenchant.so.1
(gdb) backtrace
#0 0x00007ffff4424854 in ?? () from /usr/lib/libenchant.so.1
#1 0x00007ffff442517d in enchant_dict_check () from /usr/lib/libenchant.so.1
#2 0x00007ffff48a2ea4 in ffi_call_unix64 () from /usr/lib/python2.7/lib-dynload/_ctypes.so
#3 0x00007ffff48a28c5 in ffi_call () from /usr/lib/python2.7/lib-dynload/_ctypes.so
#4 0x00007ffff48932c2 in _ctypes_callproc () from /usr/lib/python2.7/lib-dynload/_ctypes.so
#5 0x00007ffff4893aa2 in ?? () from /usr/lib/python2.7/lib-dynload/_ctypes.so
#6 0x00000000004c7c76 in PyObject_Call ()
#7 0x000000000042aa4a in PyEval_EvalFrameEx ()
#8 0x000000000042abe2 in PyEval_EvalFrameEx ()
#9 0x000000000042abe2 in PyEval_EvalFrameEx ()
#10 0x00000000004317f2 in PyEval_EvalCodeEx ()
#11 0x000000000054aa40 in ?? ()
#12 0x00000000004c7c76 in PyObject_Call ()
#13 0x000000000049e9ba in ?? ()
#14 0x00000000004c7c76 in PyObject_Call ()
#15 0x00000000004c7d36 in PyEval_CallObjectWithKeywords ()
#16 0x0000000000443e3a in ?? ()
#17 0x000000000042a862 in PyEval_EvalFrameEx ()
#18 0x000000000042abe2 in PyEval_EvalFrameEx ()
#19 0x000000000042abe2 in PyEval_EvalFrameEx ()
o
*** glibc detected *** /usr/bin/python: free(): invalid pointer: 0x00007fffd4000178 ***
(gdb) backtrace
#0 0x00007ffff68fa445 in raise () from /lib/x86_64-linux-gnu/libc.so.6
#1 0x00007ffff68fdbab in abort () from /lib/x86_64-linux-gnu/libc.so.6
#2 0x00007ffff6937e2e in ?? () from /lib/x86_64-linux-gnu/libc.so.6
#3 0x00007ffff6942626 in ?? () from /lib/x86_64-linux-gnu/libc.so.6
#4 0x00007ffff4424861 in ?? () from /usr/lib/libenchant.so.1
#5 0x00007ffff442517d in enchant_dict_check () from /usr/lib/libenchant.so.1
#6 0x00007ffff48a2ea4 in ffi_call_unix64 () from /usr/lib/python2.7/lib-dynload/_ctypes.so
#7 0x00007ffff48a28c5 in ffi_call () from /usr/lib/python2.7/lib-dynload/_ctypes.so
#8 0x00007ffff48932c2 in _ctypes_callproc () from /usr/lib/python2.7/lib-dynload/_ctypes.so
#9 0x00007ffff4893aa2 in ?? () from /usr/lib/python2.7/lib-dynload/_ctypes.so
#10 0x00000000004c7c76 in PyObject_Call ()
#11 0x000000000042aa4a in PyEval_EvalFrameEx ()
#12 0x000000000042abe2 in PyEval_EvalFrameEx ()
#13 0x000000000042abe2 in PyEval_EvalFrameEx ()
#14 0x00000000004317f2 in PyEval_EvalCodeEx ()
#15 0x000000000054aa40 in ?? ()
#16 0x00000000004c7c76 in PyObject_Call ()
#17 0x000000000049e9ba in ?? ()
#18 0x00000000004c7c76 in PyObject_Call ()
#19 0x00000000004c7d36 in PyEval_CallObjectWithKeywords ()
#20 0x0000000000443e3a in ?? ()
#21 0x000000000042a862 in PyEval_EvalFrameEx ()
#22 0x000000000042abe2 in PyEval_EvalFrameEx ()
o
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7fffe57fa700 (LWP 17532)]
0x0000000000000000 in ?? ()
(gdb) backtrace
#0 0x0000000000000000 in ?? ()
#1 0x00007ffff3f5fe33 in g_hash_table_lookup () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#2 0x00007ffff44245a3 in ?? () from /usr/lib/libenchant.so.1
#3 0x00007ffff442518b in enchant_dict_check () from /usr/lib/libenchant.so.1
#4 0x00007ffff48a2ea4 in ffi_call_unix64 () from /usr/lib/python2.7/lib-dynload/_ctypes.so
#5 0x00007ffff48a28c5 in ffi_call () from /usr/lib/python2.7/lib-dynload/_ctypes.so
#6 0x00007ffff48932c2 in _ctypes_callproc () from /usr/lib/python2.7/lib-dynload/_ctypes.so
#7 0x00007ffff4893aa2 in ?? () from /usr/lib/python2.7/lib-dynload/_ctypes.so
#8 0x00000000004c7c76 in PyObject_Call ()
#9 0x000000000042aa4a in PyEval_EvalFrameEx ()
#10 0x000000000042abe2 in PyEval_EvalFrameEx ()
#11 0x000000000042abe2 in PyEval_EvalFrameEx ()
#12 0x00000000004317f2 in PyEval_EvalCodeEx ()
#13 0x000000000054aa40 in ?? ()
#14 0x00000000004c7c76 in PyObject_Call ()
#15 0x000000000049e9ba in ?? ()
#16 0x00000000004c7c76 in PyObject_Call ()
#17 0x00000000004c7d36 in PyEval_CallObjectWithKeywords ()
#18 0x0000000000443e3a in ?? ()
#19 0x000000000042a862 in PyEval_EvalFrameEx ()
#20 0x000000000042abe2 in PyEval_EvalFrameEx ()
#21 0x000000000042abe2 in PyEval_EvalFrameEx ()
#22 0x000000000042abe2 in PyEval_EvalFrameEx ()
Beim Lesen eines anderen Beitrags habe ich versucht
ulimit -s unlimited
und verschiedene andere Werte für ulimit, aber es schien nicht zu helfen.
Ich habe die Anwendung mit "top" überwacht, und sie scheint nicht zu viele Ressourcen zu verbrauchen. Manchmal läuft sie 5 Minuten lang, manchmal 15. Während dieser Läufe verarbeitet sie Hunderte von Zeichenketten und findet Hunderte von unbekannten Wörtern. Es gibt keine bekannten Probleme mit dem Rechner, auf dem der Code läuft, es ist mein Entwicklungsrechner, alles andere läuft stabil.
Kann mir jemand erklären, was diese Fehler bedeuten? Gibt es etwas, das ich sollte oder sollte nicht in meinem Python-Code tun, die es sortieren wird? Ich vermute, es ist ein Speicherproblem (etwas, worüber ich wenig weiß), sollte ich nach Speicherlecks usw. suchen?