3 Stimmen

Python PyEnchant Segmentierungsfehler oder ungültiger Zeiger

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?

3voto

Dan-Dev Punkte 7959

Ich habe einige weitere Tests durchgeführt und festgestellt, dass es mit einem einzigen Worker-Thread gut funktioniert. Nach einigem Googeln habe ich herausgefunden, dass http://aspell.net/ steht unter "Dinge, die getan werden müssen"; "Aspell Thread sicher machen. Auch wenn Aspell selbst nicht Multi-Thread-fähig ist, möchte ich, dass es Thread-sicher ist, so dass es von Multi-Thread-Programmen verwendet werden kann." Ich verwende Aspell mit PyEnchant über Enchant, also kann ich davon ausgehen, dass das, was ich sehe, zu erwarten ist. Ich habe den/die Autor(en) von Enchant kontaktiert http://www.abisource.com/projects/enchant/ Sie sagten: "Enchant selbst ist thread-sicher. Leider sind einige seiner Backends nicht sicher, wie z.B. bei Aspell. Das ist etwas, das wir in Enchant umgehen können, indem wir alle Zugriffe auf das Aspell-Wörterbuch serialisieren und so die Thread-Unsicherheit für den Benutzer verbergen", und ich könnte eine Verbesserungsanfrage stellen. Ich habe also einen Verbesserungsantrag gestellt und freue mich auf die Verbesserung zu gegebener Zeit.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X